Ë
    š„jÜP  ã                   óÄ   — 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Zddlm	Z	m
Z
mZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ  G d„ d«      Z y)é    Né   )ÚBreaklineStatusPrinterÚMultilineLoggerÚMultilinePrinterÚQuietMultilinePrinter)ÚIDENTITYÚ
NO_DEFAULTÚLockingUnsupportedErrorÚ	NamespaceÚRetryManagerÚclasspropertyÚdeprecation_warningÚformat_bytesÚjoin_nonemptyÚparse_bytesÚremove_startÚsanitize_openÚshell_quoteÚtimeconvertÚtimetuple_from_msecÚtry_call)Ú_ProgressStatec            	       ó
  — e Zd ZdZdZdZd„ Zd„ Zd„ ZeZ	e
d„ «       Zed„ «       Zed	„ «       Zed
„ «       Zed„ «       Zeeefd„«       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zd„ Zd„ Zd„ Zd„ Zddœd„Z edd¬«      d„ «       Z ed«      d„ «       Z  ed«      d „ «       Z!d!„ Z"d"„ Z#d8d#„Z$d$„ Z% e&d%d%d&d'd(d)d)¬*«      Z'd+„ Z(d,„ Z)d-„ Z*d.„ Z+edfd/„Z,d0„ Z-ed1„ «       Z.d9d2„Z/d3„ Z0d4„ Z1d5„ Z2d:d6„Z3d7„ Z4y);ÚFileDownloadera 	  File Downloader class.

    File downloader objects are the ones responsible of downloading the
    actual video file and writing it to disk.

    File downloaders accept a lot of parameters. In order not to saturate
    the object constructor with arguments, it receives a dictionary of
    options instead.

    Available options:

    verbose:            Print additional info to stdout.
    quiet:              Do not print messages to stdout.
    ratelimit:          Download speed limit, in bytes/sec.
    throttledratelimit: Assume the download is being throttled below this speed (bytes/sec)
    retries:            Number of times to retry for expected network errors.
                        Default is 0 for API, but 10 for CLI
    file_access_retries:   Number of times to retry on file access error (default: 3)
    buffersize:         Size of download buffer in bytes.
    noresizebuffer:     Do not automatically resize the download buffer.
    continuedl:         Try to continue downloads if possible.
    noprogress:         Do not print the progress bar.
    nopart:             Do not use temporary .part files.
    updatetime:         Use the Last-modified header to set output file timestamps.
    test:               Download only first bytes to test the downloader.
    min_filesize:       Skip files smaller than this size
    max_filesize:       Skip files larger than this size
    progress_delta:     The minimum time between progress output, in seconds
    external_downloader_args:  A dictionary of downloader keys (in lower case)
                        and a list of additional command-line arguments for the
                        executable. Use 'default' as the name for arguments to be
                        passed to all downloaders. For compatibility with youtube-dl,
                        a single list of args can also be used
    hls_use_mpegts:     Use the mpegts container for HLS videos.
    http_chunk_size:    Size of a chunk for chunk-based HTTP downloading. May be
                        useful for bypassing bandwidth throttling imposed by
                        a webserver (experimental)
    progress_template:  See YoutubeDL.py
    retry_sleep_functions: See YoutubeDL.py

    Subclasses of this one must re-define the real_download method.
    i(  Nc                 ó4  — | j                  |«       g | _        || _        | j                  «        | j	                  | j
                  «       | j                  j                  d«      r3t        j                  «       | _	        t        j                  «       | _        yy)z6Create a FileDownloader object with the given options.Úprogress_deltaN)Ú_set_ydlÚ_progress_hooksÚparamsÚ_prepare_multiline_statusÚadd_progress_hookÚreport_progressÚgetÚ	threadingÚLockÚ_progress_delta_lockÚtimeÚ	monotonicÚ_progress_delta_time)ÚselfÚydlr   s      úO/var/www/html/GAP/venv/lib/python3.12/site-packages/yt_dlp/downloader/common.pyÚ__init__zFileDownloader.__init__T   sq   € à�‰�cÔØ!ˆÔØˆŒØ×&Ñ&Ô(Ø×Ñ˜t×3Ñ3Ô4Ø�;‰;�?‰?Ð+Ô,Ü(1¯©Ó(8ˆDÔ%Ü(,¯©Ó(8ˆDÕ%ð -ó    c           	      óh   — || _         dD ]&  }t        | |«      rŒt        | |t        ||«      «       Œ( y )N)	r   Údeprecated_featureÚreport_errorÚreport_file_already_downloadedÚreport_warningÚto_console_titleÚ	to_stderrÚtroubleÚwrite_debug)r+   ÚhasattrÚsetattrÚgetattr)r*   r+   Úfuncs      r,   r   zFileDownloader._set_ydl_   s9   € ØˆŒð

ò 	8ˆDô ˜4 Õ&Ü˜˜d¤G¨C°Ó$6Õ7ñ	8r.   c                 ór   —  | j                   j                  |d| j                  j                  d«      i|¤Ž y )NÚquiet)r+   Ú	to_screenr   r#   )r*   ÚargsÚkargss      r,   r>   zFileDownloader.to_screenp   s-   € Øˆ�‰×Ñ˜DÐJ¨¯©¯©¸Ó(@ÐJÀEÓJr.   c                 óf   — t        j                  dd| j                  d d «      j                  «       S )Nz(?<=[a-z])(?=[A-Z])Ú_éþÿÿÿ)ÚreÚsubÚ__name__Úlower)Úclss    r,   ÚFD_NAMEzFileDownloader.FD_NAMEu   s*   € ä�v‰vÐ,¨c°3·<±<ÀÀÐ3DÓE×KÑKÓMÐMr.   c                 óT   — | €yt        | dz  «      }|j                  dkD  ryd|d d z  S )Nz Unknowniè  éc   z--:--:--z%02d:%02d:%02déÿÿÿÿ)r   Úhours)Úsecondsr'   s     r,   Úformat_secondszFileDownloader.format_secondsy   s7   € àˆ?ØÜ" 7¨T¡>Ó2ˆØ�:‰:˜Š?ØØ $ s¨ )Ñ+Ð+r.   c                 ó<   — t        | j                  |«      d«      d›S )Nz00:z>8s)r   rO   )rH   rN   s     r,   Ú
format_etazFileDownloader.format_eta‚   s   € ä˜s×1Ñ1°'Ó:¸EÓBÀ3ÐGÐHr.   c                 ó<   — |€y t        | «      t        |«      z  dz  S )Nç      Y@©Úfloat)Úbyte_counterÚdata_lens     r,   Úcalc_percentzFileDownloader.calc_percent†   s$   € àÐØÜ�\Ó"¤U¨8£_Ñ4°uÑ<Ð<r.   c                 ó   — | €dS | d›d�S )Nz  N/A%z>5.1fú%© )Úpercents    r,   Úformat_percentzFileDownloader.format_percentŒ   s   € à"˜?ˆxÐC°7¸5°/ÀÐ0CÐCr.   c                 ó  — |t         u r"||}}d ||fv ry t        t        |«      |z  «      S ||}}|€y |€t        j                  «       }| j	                  |||«      }|xr# t        t        |«      t        |«      z
  |z  «      S ©N)r	   ÚintrU   r'   Ú
calc_speed)	rH   Ústart_or_rateÚnow_or_remainingÚtotalÚcurrentÚrateÚ	remainingÚstartÚnows	            r,   Úcalc_etazFileDownloader.calc_eta�   s�   € à”JÑØ+Ð-=�)ˆDØ˜˜iÐ(Ñ(ØÜ”u˜YÓ'¨$Ñ.Ó/Ð/à"Ð$4ˆsˆØˆ=ØØˆ;Ü—)‘)“+ˆCØ�~‰~˜e S¨'Ó2ˆØÒCœœU 5›\¬E°'«NÑ:¸dÑBÓCÐCr.   c                 ó>   — || z
  }|dk(  s|dk  ry t        |«      |z  S )Nr   çü©ñÒMbP?rT   )rh   ri   ÚbytesÚdifs       r,   ra   zFileDownloader.calc_speed    s*   € à�E‰kˆØ�AŠ:˜˜ušØÜ�U‹|˜cÑ!Ð!r.   c                 ó(   — | €dS t        | «      d›d�S )Nz Unknown B/sú>10sz/s)r   )Úspeeds    r,   Úformat_speedzFileDownloader.format_speed§   s!   € à!& ˆ~ÐS´|ÀEÓ7JÈ4Ð6PÐPRÐ4SÐSr.   c                 ó8   — | t        d«      k(  rdS t        | «      S )NÚinf)rU   r`   )Úretriess    r,   Úformat_retrieszFileDownloader.format_retries«   s   € à¤5¨£<Ò/ˆuÐA´S¸³\ÐAr.   c                 ó€   — t         j                  j                  | «      rt         j                  j                  | «      S y)Nr   )ÚosÚpathÚisfileÚgetsize)Úunencoded_filenames    r,   Úfilesize_or_nonezFileDownloader.filesize_or_none¯   s*   € ä�7‰7�>‰>Ð,Ô-Ü—7‘7—?‘?Ð#5Ó6Ð6Ør.   c                 óÒ   — t        |dz  d«      }t        t        |dz  d«      d«      }| dk  rt        |«      S || z  }||kD  rt        |«      S ||k  rt        |«      S t        |«      S )Ng       @g      ð?i  @ rl   )ÚmaxÚminr`   )Úelapsed_timerm   Únew_minÚnew_maxrf   s        r,   Úbest_block_sizezFileDownloader.best_block_sizeµ   sq   € ä�e˜c‘k 3Ó'ˆÜ”c˜% #™+ sÓ+¨WÓ5ˆØ˜%ÒÜ�w“<ÐØ�|Ñ#ˆØ�'Š>Ü�w“<ÐØ�'Š>Ü�w“<ÐÜ�4‹yÐr.   c                 ó.   — t        d«       t        | «      S )z:Parse a string indicating a byte quantity into an integer.zvyt_dlp.FileDownloader.parse_bytes is deprecated and may be removed in the future. Use yt_dlp.utils.parse_bytes instead)r   r   )Úbytestrs    r,   r   zFileDownloader.parse_bytesÂ   s   € ô 	ð aô 	bä˜7Ó#Ð#r.   c                 ó  — | j                   j                  d«      }|�|dk(  ry|€t        j                  «       }||z
  }|dk  ryt        |«      |z  }||kD  r-t        |«      |z  |z
  }|dkD  rt        j                  |«       yyy)z3Sleep if the download speed is over the rate limit.Ú	ratelimitNr   g        )r   r#   r'   rU   Úsleep)r*   Ú
start_timeri   rV   Ú
rate_limitÚelapsedrq   Ú
sleep_times           r,   Ú	slow_downzFileDownloader.slow_downÉ   s�   € à—[‘[—_‘_ [Ó1ˆ
ØÐ °Ò!2ØØˆ;Ü—)‘)“+ˆCØ˜
Ñ"ˆØ�cŠ>ØÜ�lÓ# gÑ-ˆØ�:ÒÜ˜|Ó,¨zÑ9¸GÑCˆJØ˜AŠ~Ü—
‘
˜:Õ&ð ð r.   c                 óÎ   — | j                   j                  dd«      sC|dk(  s>t        j                  j	                  |«      r!t        j                  j                  |«      s|S |dz   S )z4Returns a temporary filename for the given filename.ÚnopartFú-ú.part)r   r#   rx   ry   Úexistsrz   ©r*   Úfilenames     r,   Ú	temp_namezFileDownloader.temp_nameÙ   sI   € à�;‰;�?‰?˜8 UÔ+¨x¸3ªÜ—‘—‘ Ô)´"·'±'·.±.ÀÔ2JØˆOØ˜'Ñ!Ð!r.   c                 óF   — |j                  d«      r|d t        d«        S |S )Nr’   )ÚendswithÚlenr”   s     r,   Úundo_temp_namezFileDownloader.undo_temp_nameà   s(   € Ø×Ñ˜WÔ%Ø˜Nœc '›l˜]Ð+Ð+Øˆr.   c                 ó   — |dz   S )Nz.ytdlr[   r”   s     r,   Úytdl_filenamezFileDownloader.ytdl_filenameå   s   € Ø˜'Ñ!Ð!r.   F)Úfatalc                óf   ‡ ‡‡— ˆ ˆfd„Šˆfd„}t        j                  t         j                  |«      S )Nc                ó¼   •‡— t        j                  | ||‰j                  ˆˆfd„‰rd nˆˆfd„‰j                  j	                  di «      j	                  d«      ¬«      S )Nc                 ó\   •— t        j                  d«      ‰j                  d‰› d| › �«      fS )Ng{®Gáz„?z[download] Unable to ú file: )r'   r‰   r>   ©ÚeÚactionÚfds    €€r,   ú<lambda>zIFileDownloader.wrap_file_access.<locals>.error_callback.<locals>.<lambda>ì   s1   ø€ ¤§
¡
¨4Ó 0°"·,±,ÐAVÐW]ÐV^Ð^eÐfgÐehÐ?iÓ2jÐk€ r.   c                 ó2   •— ‰j                  d‰› d| › �«      S )Nz
Unable to r¡   ©r1   r¢   s    €€r,   r¦   zIFileDownloader.wrap_file_access.<locals>.error_callback.<locals>.<lambda>í   s!   ø€ °2·?±?ÀZÐPVÈxÐW^Ð_`Ð^aÐCbÓ3c€ r.   Úretry_sleep_functionsÚfile_access)ÚinfoÚwarnÚerrorÚ
sleep_func)r   Úreport_retryÚ_FileDownloader__to_screenr   r#   )ÚerrÚcountru   r¥   r¤   r�   s      `€€r,   Úerror_callbackz7FileDownloader.wrap_file_access.<locals>.error_callbacké   sN   ù€ Ü×,Ñ,Ø�U˜G¨"¯.©.ÜkÙ#‘dÔ)cØŸ9™9Ÿ=™=Ð)@À"ÓE×IÑIÈ-ÓXô	Zð Zr.   c                 ó>  •— t        | j                  j                  dd«      ‰| ¬«      D ]  }	  || g|¢­i |¤Žc S  y # t        $ rU}|j                  t        j
                  t        j                  fv r||_        Y d }~ŒU|j                  |dd«       Y d }~Œmd }~ww xY w)NÚfile_access_retriesé   )r¥   é   r   )	r   r   r#   ÚOSErrorÚerrnoÚEACCESÚEINVALr­   r³   )r*   r;   r?   ÚkwargsÚretryr±   r³   s         €r,   Úwrapperz0FileDownloader.wrap_file_access.<locals>.wrapperð   s‘   ø€ Ü% d§k¡k§o¡oÐ6KÈQÓ&OÐQ_ÐdhÔiò 4�ð4Ù Ð6 tÒ6¨vÑ6Ò6ñ4øô ò 4Ø—y‘y¤U§\¡\´5·<±<Ð$@Ñ@Ø&)˜œÜ Ø×(Ñ(¨¨a°×3Ñ3ûð	4ús   ®>¾	BÁ3BÁ?BÂB)Ú	functoolsÚpartialÚpartialmethod)r¤   r�   r¾   r³   s   `` @r,   Úwrap_file_accesszFileDownloader.wrap_file_accessè   s)   ú€ õ	Zô	4ô × Ñ ¤×!8Ñ!8¸'ÓBÐBr.   ÚopenTc                 óŠ   — t        ||«      \  }}t        |dd «      s$| j                  t        j                  › d�d¬«       ||fS )NÚlockedz. Proceeding without lockingT)Ú	only_once)r   r:   r7   r
   Úmsg)r*   r•   Ú	open_modeÚfs       r,   r   zFileDownloader.sanitize_openü   sL   € ä# H¨iÓ8‰ˆˆ8Ü�q˜( DÔ)Ø×ÑÔ 7× ;Ñ ;Ð<Ð<XÐYÐeiÐÔjØ�(ˆ{Ðr.   Úremovec                 ón   — t         j                  j                  |«      rt        j                  |«       y y r_   )rx   ry   rz   rÊ   r”   s     r,   Ú
try_removezFileDownloader.try_remove  s#   € ä�7‰7�>‰>˜(Ô#Ü�I‰I�hÕð $r.   Úrenamec                 ó<   — ||k(  ry t        j                  ||«       y r_   )rx   Úreplace)r*   Úold_filenameÚnew_filenames      r,   Ú
try_renamezFileDownloader.try_rename  s   € à˜<Ò'ØÜ
�
‰
�< Õ.r.   c                 ó2  — |€yt         j                  j                  |«      sy|}|€yt        |«      }|€|S |dk(  ryt	        j
                  t        «      5  t        j                  |t        j                  «       |f«       ddd«       |S # 1 sw Y   |S xY w)z4Try to set the last-modified time of the given file.Nr   )	rx   ry   rz   r   Ú
contextlibÚsuppressÚ	ExceptionÚutimer'   )r*   r•   Úlast_modified_hdrÚtimestrÚfiletimes        r,   Ú	try_utimezFileDownloader.try_utime  s‹   € àÐ$ØÜ�w‰w�~‰~˜hÔ'ØØ#ˆØˆ?ØÜ˜wÓ'ˆØÐØˆOà�qŠ=ØÜ× Ñ ¤Ó+ñ 	8Ü�H‰H�X¤§	¡	£¨XÐ6Ô7÷	8àˆ÷	8àˆús   Á+BÂBc                 ó,   — | j                  d|z   «       y)zReport destination filename.z[download] Destination: N©r>   r”   s     r,   Úreport_destinationz!FileDownloader.report_destination!  s   € à�‰Ð1°HÑ<Õ=r.   c                 ó&  — | j                   j                  d«      rt        «       | _        nã| j                  j                   j                  d«      r)t        | j                  j                   d   |«      | _        n•| j                   j                  d«      r0t        | j                  j                  j                  |«      | _        nJt        | j                  j                  j                  || j                   j                  d«       «      | _        | j                  j                  j                  xr# | j                  j                  j                  dk7  | j                  _        | j                  j                  j                  | j                  _        y )NÚ
noprogressÚloggerÚprogress_with_newliner=   Úno_color)r   r#   r   Ú
_multiliner+   r   r   Ú
_out_filesÚoutr   Ú_allow_colorsÚallow_colorsÚ_HAVE_FULLCAP)r*   Úliness     r,   r    z(FileDownloader._prepare_multiline_status%  s  € Ø�;‰;�?‰?˜<Ô(Ü3Ó5ˆD�OØ�X‰X�_‰_× Ñ  Ô*Ü-¨d¯h©h¯o©o¸hÑ.GÈÓOˆD�OØ�[‰[�_‰_Ð4Ô5Ü4°T·X±X×5HÑ5H×5LÑ5LÈeÓTˆD�Oä.¨t¯x©x×/BÑ/B×/FÑ/FÈÐSW×S^ÑS^×SbÑSbÐcjÓSkÐOkÓlˆDŒOØ'+§x¡x×'=Ñ'=×'AÑ'AÒ'nÀdÇhÁh×F\ÑF\×F`ÑF`ÐdnÑFnˆ�‰Ô$Ø(,¯©×(>Ñ(>×(BÑ(Bˆ�‰Õ%r.   c                 ó8   — | j                   j                  «        y r_   )rä   Úend©r*   s    r,   Ú_finish_multiline_statusz'FileDownloader._finish_multiline_status1  s   € Ø�‰×ÑÕr.   z
light blueÚyellowÚgreenz
bold whiteÚ )Údownloaded_bytesr\   Úetarq   rŒ   Útotal_bytesÚtotal_bytes_estimatec                 óœ  — | j                   j                  D ](  \  }}d|› d�}||vrŒ| j                  ||   |«      ||<   Œ* ||z  |d<   |j                  «       }|j	                  d«       |d   |dœ}| j
                  j                  di «      }| j                  j                  | j                  j                  |j                  d«      xs d|«      |j                  d	«      xs d
«       | j                  | j                  j                  |j                  d«      xs d|«      t        j                  |«      |j                  d«      «       y )NrB   Ú_strÚ_default_templateÚ	info_dict)r«   ÚprogressÚprogress_templateÚdownloadz)[download] %(progress._default_template)sÚprogress_idxr   zdownload-titlez%yt-dlp %(progress._default_template)sÚ_percent)ÚProgressStylesÚitems_Ú_format_progressÚcopyÚpopr   r#   rä   Úprint_at_liner+   Úevaluate_outtmplr4   r   Ú	from_dict)r*   ÚsÚdefault_templateÚnameÚstyleÚprogress_dictrû   s          r,   Ú_report_progress_statusz&FileDownloader._report_progress_status>  s?  € Ø×.Ñ.×5Ñ5ò 	<‰KˆD�%Ø�t�f˜D�>ˆDØ˜1‰}ØØ×+Ñ+¨A¨d©G°UÓ;ˆAˆdŠGð		<ð
 "2°AÑ!5ˆÐ
ÑàŸ™›ˆØ×Ñ˜+Ô&Ø!" ;¡¸]ÑKˆà ŸK™KŸO™OÐ,?ÀÓDÐØ�‰×%Ñ% d§h¡h×&?Ñ&?Ø×!Ñ! *Ó-Ò\Ð1\Øó'àŸE™E .Ó1Ò6°Qô	8ð 	×Ñ˜dŸh™h×7Ñ7Ø×!Ñ!Ð"2Ó3Ò^Ð7^Øóä*×4Ñ4°QÓ7¸¿¹¸zÓ9Jõ	Lr.   c                 ó”   —  | j                   j                  | j                  j                  | j                  j                  g|¢­i |¤ŽS r_   )r+   Ú_format_texträ   Ústreamrè   )r*   r?   r¼   s      r,   r  zFileDownloader._format_progressR  sH   € Ø$ˆt�x‰x×$Ñ$Ø�O‰O×"Ñ" D§O¡O×$@Ñ$@ðSØCGòSØKQñSð 	Sr.   c                 ó®  ‡— ddœˆfd„
}ˆfd„}‰d   dk(  rÔ| j                   j                  d«      r| j                  d«       t        ˆfd	„«      }‰j	                  || j                  |«      j                  «        |d
«      | j                  ‰j                  d«      «      d| j                  d«      dœ«       | j                  ‰t        d |d«       |d«       |d«      d¬«      «       ‰d   dk7  ry | j                   j                  d«      x}rU| j                  5  t        j                  «       | j                  k  r
	 d d d «       y | xj                  |z  c_        d d d «       t        ˆfd„ˆfd„ˆfd„«      }‰j	                  | j                  ‰j                  d«      «      j                  «       | j                  ‰j                  d«      «      || j                  |«       |d
«       |d«       |d«      | j                  ‰j                  d«      «      dœ«        |dd d!d"d#¬«      }| |d$d%«      z  }| j                  ‰|«       y # 1 sw Y   ŒîxY w)&Nrñ   )Údefaultc                 óL   •— |D ]  �^ }}t        ˆfd„|D «       «      sŒ|c S  | S )Nc              3   óD   •K  — | ]  }‰j                  |«      d u–— Œ y ­wr_   ©r#   )Ú.0rÉ   r  s     €r,   ú	<genexpr>zFFileDownloader.report_progress.<locals>.with_fields.<locals>.<genexpr>Y  s   øè ø€ Ò<°�q—u‘u˜Q“x tÔ+Ñ<ùs   ƒ )Úall)r  ÚtupsÚfieldsÚtmplr  s       €r,   Úwith_fieldsz3FileDownloader.report_progress.<locals>.with_fieldsW  s0   ø€ Ø!%ò  ‘�˜ÜÓ<°VÔ<Õ<Ø’Kð ð ˆNr.   c                 ó<   •— t        ‰j                  | «      «      d›S )Nrp   )r   r#   )Úkr  s    €r,   r¦   z0FileDownloader.report_progress.<locals>.<lambda>]  s   ø€ ¤\°!·%±%¸³(Ó%;¸DÐ$A€ r.   ÚstatusÚfinishedrà   z[download] Download completedc                  ó   •— ‰ d   ‰ d   z  S )Nrô   rŒ   r[   ©r  s   €r,   r¦   z0FileDownloader.report_progress.<locals>.<lambda>b  s   ø€  Q }Ñ%5¸¸)¹Ñ%D€ r.   rô   rŒ   rS   éd   )rq   Ú
_speed_strÚ_total_bytes_strÚ_elapsed_strrþ   Ú_percent_strz100%%)rô   zof %(_total_bytes_str)s)rŒ   zin %(_elapsed_str)s)rq   zat %(_speed_str)sú )ÚdelimÚdownloadingr   c                  ó    •— d‰ d   z  ‰ d   z  S )Nr"  rò   rô   r[   r!  s   €r,   r¦   z0FileDownloader.report_progress.<locals>.<lambda>|  s   ø€ �C˜!Ð.Ñ/Ñ/°!°MÑ2BÑB€ r.   c                  ó    •— d‰ d   z  ‰ d   z  S )Nr"  rò   rõ   r[   r!  s   €r,   r¦   z0FileDownloader.report_progress.<locals>.<lambda>}  s   ø€ �C˜!Ð.Ñ/Ñ/°!Ð4JÑ2KÑK€ r.   c                  ó   •— ‰ d   dk(  xr dS )Nrò   r   r[   r!  s   €r,   r¦   z0FileDownloader.report_progress.<locals>.<lambda>~  s   ø€ �AÐ(Ñ)¨QÑ.Ò4°1€ r.   ró   rq   rõ   rò   )Ú_eta_strr#  rþ   r&  r$  Ú_total_bytes_estimate_strÚ_downloaded_bytes_strr%  )rô   zK%(_percent_str)s of %(_total_bytes_str)s at %(_speed_str)s ETA %(_eta_str)s)rõ   zU%(_percent_str)s of ~%(_total_bytes_estimate_str)s at %(_speed_str)s ETA %(_eta_str)s)rò   rŒ   z>%(_downloaded_bytes_str)s at %(_speed_str)s (%(_elapsed_str)s))rò   z+%(_downloaded_bytes_str)s at %(_speed_str)sz3%(_percent_str)s at %(_speed_str)s ETA %(_eta_str)s)Úfragment_indexÚfragment_countz- (frag %(fragment_index)s/%(fragment_count)s))r0  z (frag %(fragment_index)s))r   r#   r>   r   Úupdaterr   ÚstriprO   r]   r  r   r&   r'   r(   r)   rQ   )r*   r  r  Ú_format_bytesrq   Úupdate_deltarú   Úmsg_templates    `      r,   r"   zFileDownloader.report_progressV  s=  ø€ Ø')ö 	ó CˆàˆX‰;˜*Ò$Ø�{‰{�‰˜|Ô,Ø—‘Ð>Ô?ÜÓDÓEˆEØ�H‰HØØ"×/Ñ/°Ó6×<Ñ<Ó>Ù$1°-Ó$@Ø $× 3Ñ 3°A·E±E¸)Ó4DÓ EØ!Ø $× 3Ñ 3°CÓ 8ñô ð ×(Ñ(¨¬MØÙÐFÓGÙÐ>Ó?ÙÐ:Ó;Øô-ô ð ˆX‰;˜-Ò'ØàŸ;™;Ÿ?™?Ð+;Ó<Ð<ˆ<Ð<Ø×*Ñ*ñ :Ü—>‘>Ó# d×&?Ñ&?Ò?Ø÷:ð :ð ×)Ò)¨\Ñ9Õ)÷:ô
 ÛBÛKÛ4ó6ˆð 	
�‰ØŸ™¨¯©¨e«Ó5×;Ñ;Ó=Ø×+Ñ+¨A¯E©E°'«NÓ;Ø Ø ×/Ñ/°Ó9Ù -¨mÓ <Ù)6Ð7MÓ)NÙ%2Ð3EÓ%FØ ×/Ñ/°·±°iÓ0@ÓAñ	
ô 		ñ #ØjØ}ØmØOØIôKˆð 	™ØaØ<ó>ñ 	>ˆð 	×$Ñ$ Q¨Õ5÷=:ð :ús   Ä#IÅ	IÉIc                 ó,   — | j                  d|› �«       y)z'Report attempt to resume at given byte.z%[download] Resuming download at byte NrÝ   )r*   Ú
resume_lens     r,   Úreport_resuming_bytez#FileDownloader.report_resuming_byte–  s   € à�‰Ð>¸z¸lÐKÕLr.   c                 ó
  ‡ — |t         u rdnd}t        j                  |||‰ j                  ˆ fd„|st        nˆ fd„‰ j
                  j                  di «      j                  |xs d«      |rd|€dnd	|› �› �¬
«       yd¬
«       y)zReport retryFÚfragmentc                 ó,   •— ‰j                  d| › �«      S )Nz[download] Got error: )r°   )rÇ   r*   s    €r,   r¦   z-FileDownloader.report_retry.<locals>.<lambda>Ÿ  s   ø€ ˜T×-Ñ-Ð0FÀsÀeÐ.LÓM€ r.   c                 ó,   •— ‰j                  d| › �«      S )Nz[download] Got error: r¨   )r£   r*   s    €r,   r¦   z-FileDownloader.report_retry.<locals>.<lambda>   s   ø€ °t×7HÑ7HÐKcÐdeÐcfÐIgÓ7h€ r.   r©   ÚhttpNr  r'  )r«   r¬   r­   r®   Úsuffix)r	   r   r¯   r°   r   r   r#   )r*   r±   r²   ru   Ú
frag_indexr�   Úis_frags   `      r,   r¯   zFileDownloader.report_retryš  s†   ø€ à%¬Ñ3‘%¸ˆÜ×!Ñ!Ø�˜ d×&6Ñ&6ÛMÙ"'•(Ó-hØ—{‘{—‘Ð'>ÀÓC×GÑGÈÒHYÐSYÓZÙSZ�X ZÐ%7™c¸qÀÀÐ=MÐNÐOö	fð
 aeö	fr.   c                 ó&   — | j                  d«       y)z,Report it was impossible to resume download.z[download] Unable to resumeNrÝ   rí   s    r,   Úreport_unable_to_resumez&FileDownloader.report_unable_to_resume¤  s   € à�‰Ð4Õ5r.   c                  ó   — y)zp Whether the downloader can download the fragments from the manifest.
        Redefine in subclasses if needed. Nr[   )Úmanifests    r,   Úsupports_manifestz FileDownloader.supports_manifest¨  s   € ð 	r.   c                 óh  — | j                   j                  dd«       xr t        j                  j	                  |«      }t        |d«      sº| j                   j                  dd«      xr> t        j                  j                  |«      xr | j                   j                  dd«       }|dk7  rY|s|rU| j                  |«       | j                  |dt        j                  j                  |«      d	œ|«       | j                  «        y
d}|r | j                   j                  d«      xs d}n²| j                   j                  d«      xs d}| j                   j                  d«      xs d}	|j                  d«      xs |g}
t        d„ |
D «       «      x}r0|t        t        j                  «       «      z
  }||kD  rd}|}||	kD  r|}	t        j                  ||	xs |«      }|dkD  r.| j!                  d|d›d|› d�«       t        j"                  |«       | j%                  ||«      }| j                  «        |dfS )zpDownload to a filename using the info from info_dict
        Return True on success and False otherwise
        Ú
overwritesTÚwriteÚ
continuedlr�   Fr‘   r  )r•   r  rô   )TFrñ   Úsleep_interval_subtitlesr   Úsleep_intervalÚmax_sleep_intervalÚrequested_formatsc              3   óF   K  — | ]  }|j                  d «      xs d–— Œ y­w)Úavailable_atr   Nr  )r  rÉ   s     r,   r  z*FileDownloader.download.<locals>.<genexpr>Ñ  s!   è ø€ Ò"YÀ! 1§5¡5¨Ó#8Ò#=¸AÓ#=Ñ"Yùs   ‚!zas required by the sitez[download] Sleeping z.2fz	 seconds z...)r   r#   rx   ry   r“   r8   rz   r2   Ú_hook_progressr{   rî   r   r`   r'   ÚrandomÚuniformr>   r‰   Úreal_download)r*   r•   rù   ÚsubtitleÚnooverwrites_and_existsÚcontinuedl_and_existsÚ
sleep_noterL  Úmin_sleep_intervalrM  rN  rP  Úforced_sleep_intervalÚrets                 r,   rü   zFileDownloader.download®  s  € ð
 —‘—‘ ¨dÓ3Ð3ò )Ü—‘—‘˜xÓ(ð 	 ô
 �x Ô)à—‘—‘ ¨dÓ3ò 9Ü—G‘G—N‘N 8Ó,ò9àŸ™Ÿ™¨°%Ó8Ð8ð "ð ˜3ŠÑ$;Ñ?TØ×3Ñ3°HÔ=Ø×#Ñ#Ø (Ø(Ü#%§7¡7§?¡?°8Ó#<ñ%ð ô	ð
 ×-Ñ-Ô/Ø"àˆ
ÙØ!Ÿ[™[Ÿ_™_Ð-GÓHÒMÈA‰Nà!%§¡§¡Ð1AÓ!BÒ!GÀaÐØ!%§¡§¡Ð1EÓ!FÒ!KÈ!Ðà )§¡Ð.AÓ BÒ QÀyÀkÐÜ"Ñ"YÐGXÔ"YÓYÐYˆ|ÐYØ(4´s¼4¿9¹9»;Ó7GÑ(GÐ%Ø(Ð+=Ò=Ø!:�JØ)>Ð&Ø(Ð+=Ò=Ø)>Ð&ä#Ÿ^™^Ø"Ð$6Ò$LÐ:LóNˆNð ˜AÒØ�N‰NÐ1°.ÀÐ1EÀYÈzÈlÐZ]Ð^Ô_Ü�J‰J�~Ô&à× Ñ  ¨9Ó5ˆØ×%Ñ%Ô'Ø�DˆyÐr.   c                 ó   — t        d«      ‚)z.Real download process. Redefine in subclasses.z-This method must be implemented by subclasses)ÚNotImplementedError)r*   r•   rù   s      r,   rT  zFileDownloader.real_downloadä  s   € ä!Ð"QÓRÐRr.   c                 ó@   — ||d<   | j                   D ]
  } ||«       Œ y )Nrù   )r   )r*   r  rù   Úphs       r,   rQ  zFileDownloader._hook_progressè  s*   € à'ˆˆ{Ñð ×&Ñ&ò 	ˆBÙˆv�Jñ	r.   c                 ó:   — | j                   j                  |«       y r_   )r   Úappend)r*   r_  s     r,   r!   z FileDownloader.add_progress_hookñ  s   € ð 	×Ñ×#Ñ# BÕ'r.   c                 óÄ   — | j                   j                  dd«      sy |€"t        j                  j	                  |d   «      }| j                  |› dt        |«      › �«       y )NÚverboseFr   z command line: )r   r#   rx   ry   Úbasenamer7   r   )r*   r?   Úexes      r,   Ú
_debug_cmdzFileDownloader._debug_cmdö  sS   € Ø�{‰{�‰˜y¨%Ô0Øàˆ;Ü—'‘'×"Ñ" 4¨¡7Ó+ˆCà×Ñ˜C˜5 ´¸DÓ0AÐ/BÐCÕDr.   c                 óÈ   — |j                  d«      }|€y | j                  j                  |«      \  }}|r|S |r*| j                  | j                  j	                  |«      «       y )NÚimpersonate)r#   r+   Ú_parse_impersonate_targetsr3   Ú_unavailable_targets_message)r*   rù   rh  Úavailable_targetÚrequested_targetss        r,   Ú_get_impersonate_targetz&FileDownloader._get_impersonate_targetÿ  sb   € Ø—m‘m MÓ2ˆØÐØØ.2¯h©h×.QÑ.QÐR]Ó.^Ñ+ÐÐ+ÙØ#Ð#ÙØ×Ñ §¡× EÑ EÐFWÓ XÔYØr.   )r·   )Fr_   )5rF   Ú
__module__Ú__qualname__Ú__doc__Ú_TEST_FILE_SIZEr   r-   r   r>   r°   r   rI   ÚstaticmethodrO   ÚclassmethodrQ   rX   r]   r	   rj   ra   rr   rv   r}   r„   r   rŽ   r–   rš   rœ   rÂ   r   rÌ   rÒ   rÛ   rÞ   r    rî   r   rÿ   r  r  r"   r9  r¯   rC  rF  rü   rT  rQ  r!   rf  rm  r[   r.   r,   r   r   %   s-  „ ñ)ðV €OØ€Fò	9ò8ò"Kð €KàñNó ðNð ñ,ó ð,ð ñIó ðIð ñ=ó ð=ð
 ñDó ðDð Ø=GÐQ[ò Dó ðDð ñ"ó ð"ð ñTó ðTð ñBó ðBð ñó ðð
 ñ
ó ð
ð ñ$ó ð$ò'ò "òò
"ð +0ô Cñ( �f DÔ)ñó *ðñ �hÓñ ó  ð ñ �hÓñ/ó  ð/ò
ò&>ó
Còñ Ø%ØØØØØØô€NòLò(Sò>6ò@Mð <FÈTó fò6ð ñó ðó
4òlSòò(ó
Eó	r.   r   )!rÔ   r¹   r¿   rx   rR  rD   r$   r'   Ú
minicursesr   r   r   r   Úutilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Úutils._utilsr   r   r[   r.   r,   ú<module>rw     sQ   ðÛ Û Û Û 	Û Û 	Û Û ÷ó ÷÷ ÷ ÷ ó õ$ *÷cò cr.   