
    ĞiT                         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dS )    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dS )HttpQuietDownloaderc                     d S N )selfargskargss      _C:\Users\betacode\Desktop\descargarYoutube\venv\Lib\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dS )
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                 \    |                      d           |                     ||||          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=       "] 	^ 	^ 	^  eWjAAAr   Nc                 T    |rd| dnd}|                      d| d|dd           d S )N ; z
[download]z Skipping fragment dz ...)r   )r   r&   r%   s      r   report_skip_fragmentzFragmentFD.report_skip_fragmentC   sG    'j#jjjjRNCNNJNNNNOOOOOr   c                 V    |                     d          }|rt          |d |          n|S )Nhttp_headers)getr	   )r   	info_dicturlheaderss       r   _prepare_urlzFragmentFD._prepare_urlG   s/    --//.5>wsD'***3>r   c                 \    |                      |           |                     ||           d S r   )_prepare_frag_download_start_frag_download)r   ctxr3   s      r    _prepare_and_start_frag_downloadz+FragmentFD._prepare_and_start_frag_downloadK   s2    ##C(((!!#y11111r   c                 d    |d         duo&|d         dk    o| j                             d           S )NliveTtmpfilename-_no_ytdl_file)paramsr2   )r   r:   s     r   __do_ytdl_filezFragmentFD.__do_ytdl_fileO   s7    6{$&m3}+=+DmT[__]lMmMmImmr   c                    d|vsJ |                      |                     |d                   d          \  }}	 t          j        |                                          }|d         d         d         |d<   d|d         v r|d         d         |d<   n# t
          $ r d	|d<   Y nw xY w|                                 d S # |                                 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'JCPP		
6;;==11I$-l$;<N$OPW$XC !	, 777%.|%<]%KM" 	' 	' 	'"&C	' LLNNNNNFLLNNNNs*   AB B> B%"B> $B%%B> >Cc                    |                      |                     |d                   d          \  }}	 dd|d         ii}d|v r|d         |d<   |                    d          |d         |d<   |                    t	          j        d|i                     |                                 d S # |                                 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$2D2DS_2U2UWZ[[1	&"S!12%J
 ##,/,>
=)ww'((4/23C/D
+,##DJj/I$J$JKKK##%%%%%##%%%%s   A$B. .Cc                    d|d         |d         fz  }||p|                     d          ||                     d          d}d}|d         j                             d	d
          r(|                     |                     |                    }|x|d<   |d<   |d                             ||          \  }	}
|	sdS |                     d          r|                     d          |d<   ||d<   d
S )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}+=sCS?T*UU#Dy}}^'D'D(ggh''	
 
 t9d33 	W"33DNNCT4U4UVVOIXX,-4E0FY''(9;MNN
 	5!!*-- 	J'9'='=j'I'IC#$->)*tr   c                    |                     d          sd S 	 |                     |d         d          \  }}n'# t          $ r |                     d          rY d S  w xY w||d<   |                                }|                                 |S )Nrf   rbr=   )r2   rL   FileNotFoundErrorrP   rR   )r   r:   downfrag_sanitizedfrag_contents        r   _read_fragmentzFragmentFD._read_fragment   s    ww455 	4	#'#5#5c:W6XZ^#_#_ D..  	 	 	wwv tt	 .<)*yy{{

s   9 AAc                    	 |d                              |           |d                                          |                     |          r|                     |           | j                            dd          s|                     |d                    |d= d S # |                     |          r|                     |           | j                            dd          s|                     |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22$$&&&""3'' +%%c***;??#3U;; D$A BCCC1222	 ""3'' +%%c***;??#3U;; D$A BCCC122222s   5B A%Dc           
         |                     dd          s,d|d         z  }|                    dd          }|r|d|z  z  }nd}|                     d	| j         d
|            |                     |d                    t          | j        i | j        dddddd          }|                     |d                   }d}| 	                    |          }|dk    rd}|
                    |dd           |                     |          rt          j                            |                     |d                             }| j                            dd          }	|	r|r|                     |           |                    d          du }
|d         dk    o|dk    }|
s|rA|
rdnd}|                     | d           dx|d<   }d|v r|d= |                     |           nC|	s|r|                     |           dx|d<   }|                     |           |d         dk    sJ |                     ||          \  }}|
                    ||||d           d S )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   ~~fe,, 	/"S%77Owwz1--H G#;h#FF.OM4<MMOMMNNNJ000  ,
k,
"#(),
 ,
 ,
   nnS_55	 **;77
>>I 	

&
 
 	 	 	
 s## 	2!w~~d.@.@Z.Q.QRRt<<J 2. 2$$S))) WW^44<
"%&6"7!";"O
a 	/ 	/3= M//L  ''"GGGI I I9::C()J%,,/))#... " ;' 2,,S1119::C()J%%c***+,1111#'#5#5k9#M#M [

&&/9
 
 	 	 	 	 	r   c                 6    d         }d                              d          d|d         d         d         dt          j                    d	<   t          |           fd
}d                             |           d	         S )Nr   r   r_   downloadingrJ   rE   r>   )statusdownloaded_bytesrJ   rY   rE   r>   startedc                    | d         dvrd S 	s                      d          rd         d<   |                      d          k    rd S                      d          d<                        d          d<   j        d<   |                      d          pd	}|                     d
i           | d<   d         sTd         |z   d         dz   z  	z  }|_                            |                      d                     j        d<   n(                    |                      d                     | d         dk    r/dxx         dz  cc<   d         d<                                    j        xd<   d<   j        j        xd<   d<   j	        j        d<   
                               d S )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   {"=== @377+;#<#< @*-.>*?&'!aeeHoo&?&?$'GGN$;$;E.!$'GGN$;$;E.!'/E) uu]338q&'eeK&<&<A"# v; ;:;>NN-.246AB  "0&8 9 9:::08,--&8 9 9:::{j((&'''1,'''(-.>(?$%%%'''QYQddE$%,M(N,4N,AAE'NS\#<.E%Ly1111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1%	2 %	2 %	2 %	2 %	2 %	2 %	2 %	2 %	2 %	2 %	2N 	D	##$67779~r   c                    |d                                           |                     |          r.|                     |                     |d                              t	          j                    |d         z
  }|d         dk    }|r|                     |d                   }n|d         }|s4|r|                     |d                    |                     d           dS |r|                     |d         |d                    |                    d	          }| j	                            d
          ra|r_t          j        t                    5  t          j        |d         t	          j                    |f           d d d            n# 1 swxY w Y   |                     |||d         d||                    d          |                    d          |                    d          d|           dS )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  sI   M  """s## 	AOOD..s:??@@@)++I.m$+ 	F#44S5GHH"#DE 
	G 4M 2333<===5 	GOOC.J@@@ww233H{|,, G G(33 G GHS_ty{{H.EFFFG G G G G G G G G G G G G G G 	 0+J ggh''GGN33GGN33	
 	
 		 		 		 ts   /FFFc                 *   d|vrd|d<   |d         s,d|d         z  }|                     dd          }|r|d|z  z  }nd}|                     d	| j         d
|            |                     |d                   }|                    |dd           d S )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7Owwz1--H G#;h#FF.OM4<MMOMMNNNnnS_55 	

&
 
 	 	 	 	 	r   c                 .     i  fd fd}|S )Nc                     | vrCj                                                 |                                                     | <   |          S r   )r   urlopenr6   rP   )r4   
_key_cacher3   r   s    r   _get_keyz&FragmentFD.decrypter.<locals>._get_keyX  sN    *$$"&("2"243D3DYPS3T3T"U"U"Z"Z"\"\
3c?"r   c                    |d S |                      d          }|r|d         dk    r|S |                     d          pt          j        d| d                   }|                     d          p  t          d          p|d	                   |d<   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7L $<#9Y#F#F##!!$''Z6;vxHX?Y+Z+ZB#/#3#3E#:#: $s&.h|IGY/Z/Z/q^jkp^q&r&r 
 {vu-- $##4\<PUCVXZ[[\\\r   r   )r   r3   r   r   r   s   `` @@r   	decrypterzFragmentFD.decrypterU  s`    
	# 	# 	# 	# 	# 	# 	#
	] 	] 	] 	] 	] 	] 	]   r   c           	      V    dgt          |          dk    r  j        |d         i S  j                            dd          }dk    r                                t          t          |d                    } fd} G d dt          j        j	                  }t          j        d	k    rd
 }nd }fd}g }	t          |          D ]c\  }
\  }}} |t          j        |z                      }|                    ||
| ||          ||          }|	                    ||f           dd}|	D ]Z\  }}	 |o
 ||          }n# t"          $ r dd<   Y nw xY w|                    d           @# |                    d           w xY wd         s	|st"          |S )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                 B    |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}  s_    ".C"%C545Y	c c-3c9<Pac c c c cr   c                       e Zd Zd ZdS )?FragmentFD.download_and_append_fragments_multiple.<locals>.FTPEc                     d S 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                 x    	 	 |                      d          S # t          $ r  t          j        j        $ r Y 7w xY w)NTg?)resultKeyboardInterrupt
concurrentfuturesTimeoutErrorfutures    r   future_resultzHFragmentFD.download_and_append_fragments_multiple.<locals>.future_result  sY    !!%}}S111,   %-: ! ! ! !s    99c                 *    |                                  S r   )r   r   s    r   r   zHFragmentFD.download_and_append_fragments_multiple.<locals>.future_result  s    }}&r   c              3   4   K   | D ]}d         s d S |V  d S )Nr   r   )fgfr   s     r   interrupt_trigger_iterzQFragmentFD.download_and_append_fragments_multiple.<locals>.interrupt_trigger_iter  s?        (+ EE r   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  ss   
 "F4yy1545tAwI&IIIkoo&EqII!**<888l4)<==>>	c 	c 	c 	c 	c 	c 	c 	c	 	 	 	 	:%8 	 	 	
 7d??! ! ! !' ' '	 	 	 	 	 09$ 	% 	%,C,#y)$ty|!;<<==C**[#s4J4J94U4UW`beffCLL#s$$$$ 	( 	(HC(6MM#$6$6$ - - -',!!$$$- $''''$'''' # 	$G 	$## s*   EE=E# E="E##E==Fc                     dS )NFr   )r   s    r   <lambda>zFragmentFD.<lambda>  s    e 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                             dd          sd  fd fd}	                               }
t          j         j                             dd                              dd          z            }|dk    rfd	}|pt
          j                            |          5 }	 |                    ||          D ]V\  }}}	                    ||d
            |	 |
| 
                                        |          s d d d            dS WnQ# t          $ rD                                                        ddd           |                    d            w xY w	 d d d            n# 1 swxY w Y   ny|D ]v}d         s nk	  |            |	 |
| 
                                        |d                   }n'# t          $ r                     d          rY  n w xY w|s dS w|=d                              |                       d                                                                         S )Nskip_unavailable_fragmentsTc                     dS )NTr   )rT   s    r   r  z:FragmentFD.download_and_append_fragments.<locals>.<lambda>  s     r   c           
         
d         sd S | d         xd<   d d<   t          	                    d                    }|                     d          }|rd|d         |d	         d
z
  fz  |d<    |                     d          pd
z
            fd}t          j                            d          |          D ]}	 |                     d          d<                       | d         	|	                    d                    s d S Q# t
          t          f$ r}||_        Y d }~nd }~wt          $ r r Y w xY wd S )Nr   r&   rJ   
last_errorr1   
byte_rangezbytes=%d-%dstartendr   RangerI   c                     r ||k    rd                                                               | ||           | d<   d S )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  sV     /UW__&,,...!!#ugz5II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GJ-. $C$Y]]>%B%BCCG!l33J `#0Jw4GTYIZ]^I^3_#_  HX\\'22FzA~GGE( ( ( ( ( ( ( ( &dkoo6H&I&I>ZZ  
,4LL9I,J,JC()22%)WimmTbFcFce e  ">2   "%EKHHHH$      s   	A
DE(D44EEc                    | r!                     | | |                     nZ |dz
            s                    |d           n5|d                                                              d| d           dS dS )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  s     %%c99\:+N+NOOOOXj1n-- ))*6JKKKKM"((***!!"Xj"X"X"XYYYu4r   r   r   r   c                                                      } | |           | | d         |                    d          fS )Nr&   rf   )copyr2   )r   ctx_copyr:   r"  s     r   rn   zDFragmentFD.download_and_append_fragments.<locals>._download_fragment  sB    88::!!(H555,!7Fc9d9d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B 	&%~H	 	 	 	 	 	 	 	B		 		 		 		 		 		 		  >>)44iKOO;Q??#''.Z[B\B\\^ ^??e e e e e e
 J
*==kJJ d?CxxHZ\e?f?f ) );*m

;H.8$ $     //?/?$J]J]^aJbJb/c/ceoqtuu )#(       )) )   11333%%U`ejo & q q qMMuM---)                & ! !(+ E%%h444,_((43F3Fs3K3KLLhWcNdfik kFF(    }}Y//   ! 55! "$$[[]]333$$&&&))#y999sD   <F
>AD,*D,+F
,AE::F

FF%<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!      s`       ! !FB B B
P P P P? ? ?2 2 2n n n  & & &    *  	3 	3 	3B B BH: : :x" " "H  (     4> > >B ;L:K3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>r8     sZ             				   " " " " " "       4 4 4 4 4 4 4 4             = = = = = = = = = = = = = = = = = = - - - - - - / / / / / /! ! ! ! !& ! ! !t: t: t: t: t: t: t: t: t: t:r   