o
    ip                     @   s^  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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mZmZmZmZmZmZmZmZmZmZmZmZ G dd	 d	e jZ G d
d deZ!G dd de!Z"G dd de!Z#G dd de!Z$G dd de!Z%G dd de!Z&G dd de!Z'dd e( ) D Z*dd Z+dd Z,dS )    N   )
FragmentFD   )Request)EXT_TO_OUT_FORMATSFFmpegPostProcessor)PopenRetryManager_configuration_argscheck_executableclasspropertycli_bool_option
cli_optioncli_valueless_optiondetermine_extencodeArgumentfind_available_port
remove_endtraverse_objc                   @   s   e Zd Ze Ze ZdS )FeaturesN)__name__
__module____qualname__enumauto	TO_STDOUTMULTIPLE_FORMATS r   r   N/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/downloader/external.pyr       s    r   c                   @   s   e Zd ZdZdZdZdd Zedd Ze	dd	 Z
ejd
d Zed#ddZedd Zed#ddZdd Zd$ddZd%ddZd#ddZdd Zdd  Zd!d" ZdS )&
ExternalFD)httphttpsftpftpsr   Tc              	   C   s  |  | | |}d | _z4zt }| ||}W n ty6   |ds' d}| d|   d Y nw W | jrA| 	| j n| jrL| 	| j w w |dkr{|dt | d}|dkrst
j|}| || |||d | || d	S | d
 | d|  |f  dS )Nis_liver   [z] Interrupted by userfinished)filenamestatuselapsed-)downloaded_bytestotal_bytesT
z%s exited with code %dF)report_destination	temp_name_cookies_tempfiletime_call_downloaderKeyboardInterruptget	to_screenget_basename
try_removeospathgetsize
try_renameupdate_hook_progress	to_stderrreport_error)selfr'   	info_dicttmpfilenamestartedretvalr(   fsizer   r   r   real_download*   sL   


	

zExternalFD.real_downloadc                 C   s   | j d d  S )N)r   lowerclsr   r   r   r6   S   s   zExternalFD.get_basenamec                 C   s   |   S N)r6   rI   r   r   r   EXE_NAMEW   s   zExternalFD.EXE_NAMEc                 C   s   | j S rK   rL   )r@   r   r   r   exe[   s   zExternalFD.exeNc                 C   s6   t |d |  fv r| jn|| jg}|sdS || _|S )NF)r   r6   rL   AVAILABLE_OPTrN   rJ   r9   r   r   r   	available_   s   zExternalFD.availablec              	      s`   t |d ptj jv d|d vptj jv t|ddd t  fdd|d dD fS )	N	to_stdout+protocol)hls_aes.extra_param_to_segment_urlextra_param_to_key_urlc                 3   s    | ]}| j v V  qd S rK   )SUPPORTED_PROTOCOLS).0protorI   r   r   	<genexpr>o   s    z&ExternalFD.supports.<locals>.<genexpr>)allr4   r   r   SUPPORTED_FEATURESr   r   split)rJ   rA   r   rI   r   supportsi   s   zExternalFD.supportsc                 C   s   |  |o	| |S rK   )rQ   r_   )rJ   rA   r9   r   r   r   can_downloadr   s   zExternalFD.can_downloadc                 C   s   t | j||S rK   )r   params)r@   command_optionparamr   r   r   _optionv   s   zExternalFD._optiontruefalsec                 C   s   t | j|||||S rK   )r   ra   )r@   rb   rc   
true_valuefalse_value	separatorr   r   r   _bool_optiony   s   zExternalFD._bool_optionc                 C   s   t | j|||S rK   )r   ra   )r@   rb   rc   expected_valuer   r   r   _valueless_option|   s   zExternalFD._valueless_optionc                 O   s*   t |  | jd| j|g|R i |S )Nexternal_downloader_args)r
   r6   ra   r4   rL   )r@   keysargskwargsr   r   r   r
      s   zExternalFD._configuration_argsc                 C   s\   | j jjstjddd}|  |j| _| d| j d | j j	| j | j jjp-| jS )Nz.cookiesF)suffixdeletez.[download] Writing temporary cookies file to "")
ydl	cookiejarr'   tempfileNamedTemporaryFileclosenamer0   r5   save)r@   tmp_cookiesr   r   r   _write_cookies   s   
zExternalFD._write_cookiesc                 C   s  dd |  ||D }| | d|vr(| ||\}}}|r&|r&| | |S | jdd}t| jd| jd| d}|D ]}	| ||\}}}|sN n|rU| | t |	_	q?|sa|j	rad	S | 
|}
| |d
\}}t|d D ]a\}}| d| }z
| |d\}}W n1 ty } z%|r|dkr| || W Y d}~qt| d| d|  W Y d}~ d	S d}~ww ||
||  |  | jdds| | qt|  | | d dS )z. Either overwrite this or implement _make_cmd c                 S      g | ]}t |qS r   r   )rY   ar   r   r   
<listcomp>       z/ExternalFD._call_downloader.<locals>.<listcomp>	fragmentsskip_unavailable_fragmentsTfragment_retriesN)
frag_indexfatalwb-Fragrbr   zUnable to open fragment z; keep_fragmentsF
.frag.urlsr   )	_make_cmd
_debug_cmd_call_processr>   ra   r4   r	   report_retry	Exceptionerror	decryptersanitize_open	enumerateOSErrorreport_skip_fragmentr?   writereadrx   r7   )r@   rB   rA   cmd_stderr
returncoder   retry_managerretrydecrypt_fragmentdestr   fragmentfragment_filenamesrcerrr   r   r   r2      sV   





zExternalFD._call_downloaderc                 C   s    t j|d| jrtjdS d dS )NT)textr   )r   run_CAPTURE_STDERR
subprocessPIPE)r@   r   rA   r   r   r   r      s    zExternalFD._call_processrK   )re   rf   N)T)r   r   r   rX   r]   r   rF   classmethodr6   r   rL   	functoolscached_propertyrN   rQ   r_   r`   rd   rj   rl   r
   r|   r2   r   r   r   r   r   r   %   s0    )


	




1r   c                   @      e Zd ZdZdZdd ZdS )CurlFD-VFc                 C   sD  | j dd|dg}| jj|d }|r|d|g7 }|dd ur6|d  D ]\}}|d| d| g7 }q&|| d	d
dd7 }|| dd7 }|| dd7 }|| dd7 }| dd}t	|dkrr|d dv rnd|d< ||7 }|| dd7 }|| dd7 }|| dd7 }|| dd 7 }|| 
 7 }|d!|d g7 }|S )"Nz
--location-oz--compressedurlz--cookiehttp_headers--header: z--continue-at
continuedlr*   0z--silent
noprogressz	--verboseverbose--limit-rate	ratelimitz--retryretriesr   r   infinfinite
2147483647z--max-filesizemax_filesize--interfacesource_addressz--proxyproxyz
--insecurenocheckcertificate--)rN   rt   ru   get_cookie_headerr4   itemsrj   rl   rd   lenr
   )r@   rB   rA   r   cookie_headerkeyvalr   r   r   r   r      s.   zCurlFD._make_cmdN)r   r   r   rO   r   r   r   r   r   r   r          r   c                   @      e Zd ZdZdd ZdS )AxelFDr   c                 C   s   | j d|g}|dd ur#|d  D ]\}}|d| d| g7 }q| jj|d }|r8|dd| dg7 }||  7 }|d|d g7 }|S )	Nr   r   z-Hr   r   zCookie: z--max-redirect=0r   )rN   r4   r   rt   ru   r   r
   r@   rB   rA   r   r   r   r   r   r   r   r      s   zAxelFD._make_cmdNr   r   r   rO   r   r   r   r   r   r          r   c                   @   r   )WgetFD	--versionc           	      C   s   | j d|ddg}| jj|d r|d|  g7 }|dd ur6|d  D ]\}}|d| d| g7 }q&|| d	d
7 }| dd}t|dkrX|d dv rTd|d< ||7 }|| dd7 }| j	d}|rxdD ]}|d| d| g7 }qj|| 
dd7 }||  7 }|d|d g7 }|S )Nz-Oz-nvz--compression=autor   z--load-cookiesr   r   r   r   r   z--triesr   r   r   r   r   z--bind-addressr   r   )
http_proxyhttps_proxyz	--execute=z--no-check-certificater   r   )rN   rt   ru   r   r|   r4   r   rd   r   ra   rl   r
   )	r@   rB   rA   r   r   r   r   r   varr   r   r   r      s*   zWgetFD._make_cmdNr   r   r   r   r   r      r   r   c                       sZ   e Zd ZdZdZedd Zedd Z fddZd	d
 Z	dddZ
 fddZ  ZS )Aria2cFDz-v)r    r!   r"   r#   dash_frag_urlsm3u8_frag_urlsc                    s    dg} fdd|D }t |S )Nz#EXT-X-BYTERANGEc                 3   s    | ]
}t |  V  qd S rK   )research)rY   featuremanifestr   r   r[     s    z-Aria2cFD.supports_manifest.<locals>.<genexpr>)r\   )r   UNSUPPORTED_FEATUREScheck_resultsr   r   r   supports_manifest  s   zAria2cFD.supports_manifestc                 C   s"   t j| r| S dt jj |  S )N.)r8   r9   isabssep)fnr   r   r   _aria2c_filename  s   "zAria2cFD._aria2c_filenamec                    s   	 t ||S rK   )ra   r4   r   struuiduuid4superr2   )r@   rB   rA   	__class__r   r   r2     s   zAria2cFD._call_downloaderc                 C   sd  | j ddddddddd	d
g}d|v r|ddg7 }n|ddg7 }| jj|d r2|d|   g7 }|dd urO|d  D ]\}}|d| d| g7 }q?|| dd7 }|| dd7 }|| dd7 }|| ddddd7 }|| d d!ddd7 }|| d"d#ddd7 }|| 	 7 }d$|v r|d%d&|d$ d'  d(|d$ d)  g7 }t
j|}|r|d*| |t
jj g7 }d|vr|d+| t
j|g7 }|d,g7 }d|v r(|d-g7 }| d.}g }t|d D ]\}	}
t
j| d/|	 }|d0|
d | | q| |d1\}}|d2|  |  |d3| |g7 }|S |d4|d g7 }|S )5N-cz	--no-confz--console-log-level=warnz--summary-interval=0z--download-result=hidez--http-accept-gzip=truez--file-allocation=nonez-x16z-j16z-s16r   z--allow-overwrite=truez --allow-piece-length-change=truez--min-split-size1Mr   z--load-cookies=r   r   r   z--max-overall-download-limitr   r   r   z--all-proxyr   z--check-certificater   rf   re   r   z--remote-time
updatetimez--show-console-readoutr   __rpcz--enable-rpcz--rpc-listen-port=portz--rpc-secret=secretz--dirz--outz--auto-file-renaming=falsez--uri-selector=inorderr   r   z
{}
	out={}r   r-   -ir   )rN   rt   ru   r   r|   r4   r   rd   rj   r
   r8   r9   dirnamer   r   basenamer   appendformatr   r   joinencoderx   )r@   rB   rA   r   r   r   dnurl_list_fileurl_listr   r   r   streamr   r   r   r   r   '  sZ   




zAria2cFD._make_cmdr   c           
      C   s   t t }td||d| g|d }td| d|dt| ddd id	}| j	|}t
|}	W d    n1 sBw   Y  |	d
|ksRJ d|	d S )Nz2.0ztoken:)jsonrpcidmethodra   zhttp://localhost:z/jsonrpczapplication/json)zContent-TypezContent-Lengthr\   )dataheadersproxiesr  z$Something went wrong with RPC serverresult)r   r   r   jsondumpsr   r   r   rt   urlopenloadr4   )
r@   rpc_port
rpc_secretr  ra   sanitycheckdrequestrrespr   r   r   
aria2c_rpc_  s,   
zAria2cFD.aria2c_rpcc                    s  d|vrt  ||S t| j|d d |d d }t }d|v }|r+t|d nd}|dddd|r8|nd |r=dnd d	}| || d
ddd}t	|dt
jt
jd}	td |	 }
|
d u r|d}|dd|g}|d||d| }|d|}||d||dd }||k rd }|t|||rd n|||| |pd |rt|t|d nd t | d | || |st||kr|d |	 }
ntd |	 }
|
d u sfd|	j |
fW  d    S 1 sw   Y  d S )Nr   r   r   r   r   	_filenamedownloadingr   )r'   r(   r)   r+   fragment_countfragment_indexF)averagec             
   W   s@   t td ttt|dd| fpdg}t||rt| S d S )N.r   r   )tuplefiltermapfloatr   sumr   )r   r  objr   r   r   r   get_stat  s   &z(Aria2cFD._call_process.<locals>.get_statT)r   stdoutr   g?zaria2.tellActivezaria2.tellStoppedtotalLengthcompletedLengthdownloadSpeed)r+   speedr,   total_bytes_estimateetar  r)   zaria2.shutdowng? )r   r   r   partialr  r1   r   r4   r=   r   r   DEVNULLr   sleeppollr<   intminwaitr   r   )r@   r   rA   send_rpcrC   
fragmented
frag_countr(   r  prD   active	completed
downloadedr#  totalr   r   r   r   s  sZ    





	
$zAria2cFD._call_process)r   )r   r   r   rO   rX   staticmethodr   r   r2   r   r  r   __classcell__r   r   r   r   r     s    

	
8r   c                   @   r   )HttpieFDr   r    c                 C   st   ddd||d g}| dd ur%|d  D ]\}}|| d| g7 }q| jj|d }|r8|d| g7 }|S )Nr    z
--downloadz--outputr   r   :zCookie:)r4   r   rt   ru   r   r   r   r   r   r     s   zHttpieFD._make_cmdN)r   r   r   rO   rL   r   r   r   r   r   r8    r   r8  c                   @   sF   e Zd ZdZejejfZedddZ	dd Z
edd Zd	d
 ZdS )FFmpegFD)r    r!   r"   r#   m3u8m3u8_nativertsprtmprtmp_ffmpegmmshttp_dash_segmentsNc                 C   s   t  jS rK   )r   rQ   rP   r   r   r   rQ     s   zFFmpegFD.availablec                 C   s   dS )z Override this in subclasses  Nr   )r@   procstdinr   r   r   on_process_started  s   zFFmpegFD.on_process_startedc                 C   s:   | do| do| d od| dg vo| |S )Nrequested_formatsrT   allow_unplayable_formatszno-direct-mergecompat_opts)r4   r`   )rJ   rA   ra   r   r   r   can_merge_formats  s   

zFFmpegFD.can_merge_formatsc           "      C   s  t | d}|js| d dS |  |jdg}dD ]}| j|dr+|d|g7 } nq| jds7|dg7 }d }| jd	}|rhtd
|sLd| }|	dr[| 
|   d tj }||d< ||d< |dpnd|d}}	t|d}
|dp|g}t|D ]L\}}td|d }|r| jj|d ng }|r|dddd |D g |dr|r|dddd |d  D g |r|dt|g7 }|	r|dt|	| g7 }|d }|d!kr|d"}|d#}|d$}|d%}|d&}|d'}|d(d}|d)}|d ur|d*|g7 }|d ur*|d+|g7 }|d ur5|d,|g7 }|d ur@|d-|g7 }|d urK|d.|g7 }|d urV|d/|g7 }|r_|d0d1g7 }t|trr|D ]	}|d2|g7 }qgnt|tr~|d2|g7 }n|d3kr|d4r|d5g7 }|d }| jd6r|	d7r|d8d9g7 }td:tjd;krd7nd<|}|t|dp|
7 }|g | d=|d>  d=fd?|7 }q|s|	r| jd@s|dAdBg7 }|ds|d3krt|D ]\}}|dCd}|dD| dE| g q| jdFdr|dGt| jg7 }|dH }|dIv rs|dJkp2| jdK}|d u r=|d4}|rG|dLdMg7 }n~|dLdNg7 }|jdOkrr|jdPrr|dQrl|dQ  dRd dSv rr|dTdUg7 }nR|d!kr|dLdVg7 }nF|dNkr|dJkr|dLdMg7 }n5|dWkrt!t"|dX}|dWkr| 
dY n| 
dZ| d[ |dLt#||g7 }n
|dLt#||g7 }|t|d\7 }|| d]7 }d^d_ |D }|$|%| | &| t'd`d |D }t(|t)j*|daD}|r| +||j, z|- } W n) t.y2 }! zt|!t/r't0j1dbkr'|s'|2dc  |j3d dd  d }!~!ww | W  d    S 1 s@w   Y  d S )eN)
downloaderzDm3u8 download detected but ffmpeg could not be found. Please installFz-y)quietr   z	-loglevelr   z-hide_bannerr   z[\da-zA-Z]+://zhttp://sockszt does not support SOCKS proxies. Downloading is likely to fail. Consider adding --hls-prefer-native to your command.
HTTP_PROXYr   section_startr   section_end)downloader_optionsffmpeg_args.rE  z	https?://r   z-cookiesr&  c              	   s   s4    | ]}|j  d |j d|j d|j dV  qdS )r   z; path=z	; domain=z;
N)ry   valuer9   domain)rY   cookier   r   r   r[   	  s
    "
z,FFmpegFD._call_downloader.<locals>.<genexpr>r   z-headersc                 s   s$    | ]\}}| d | dV  qdS )r   z
Nr   )rY   r   r   r   r   r   r[     s   " z-ssz-trT   r>  
player_urlpage_urlapp	play_pathtc_urlflash_version	rtmp_live	rtmp_connz-rtmp_swfverifyz-rtmp_pageurlz	-rtmp_appz-rtmp_playpathz-rtmp_tcurlz-rtmp_flashverz
-rtmp_livelivez
-rtmp_connrA  r$   z-reenable_file_urlszfile:z-protocol_whitelistz#file,crypto,data,http,https,tcp,tlsz^file://(?:localhost)?/ntzfile:/_ir   r   force_keyframes_at_cutsr   copymanifest_stream_numberz-mapr9  testz-fsext)r;  r<  r*   hls_use_mpegtsz-fmpegtsmp4ffmpegneeds_adtstoascacodecr   )aacmp4az-bsf:aaac_adtstoascflvunknown_videoz.partzThe video format is unknown and cannot be downloaded by ffmpeg. Explicitly set the extension in the filename to attempt download in that formatz3The video format is unknown. Trying to download as z according to the filename)rO  ffmpeg_args_out.)_o1_or&  c                 S   r}   r   r~   )rY   optr   r   r   r   w  r   z-FFmpegFD._call_downloader.<locals>.<listcomp>c                 s   s    | ]	}|d  dv V  qdS )r   )r*   zpipe:Nr   )rY   fmtr   r   r   r[   {  s    )rC  envwin32   q)timeout)4r   rQ   r?   check_version
executablera   r4   r   match
startswithreport_warningr6   r8   environra  r   r   rt   ru   get_cookies_for_urlextendr   r   r   
isinstancelistsubry   r
   _TEST_FILE_SIZEr   	_featuresr^   r   r   r   r   _ffmpeg_filename_argumentr   anyr   r   r   rD  rC  r-  BaseExceptionr3   sysplatformcommunicate_or_killkill)"r@   rB   rA   ffppro   	log_levelru  r   
start_timeend_timefallback_input_argsselected_formatsirt  is_httpcookiesrT   rT  rU  rV  rW  rX  rY  r\  connentryr   stream_numberrd  
use_mpegtspipedrB  rD   er   r   r   r2     s
  







&















*


>




&zFFmpegFD._call_downloaderrK   )r   r   r   rX   r   r   r   r]   r   rQ   rD  rH  r2   r   r   r   r   r:    s    
r:  c                 C   s,   i | ]\}}| d r|dvr| |qS )FD)r   r   )endswithr6   )rY   ry   klassr   r   r   
<dictcomp>  s    r  c                   C   s   t t S rK   )sorted_BY_NAMErn   r   r   r   r   list_external_downloaders  s   r  c                    s>   t jt j| d  t pt fddt D dS )zO Given the name of the executable, see whether we support the given downloader r   c                 3   s    | ]
}|j  v r|V  qd S rK   rM   )rY   r  bnr   r   r[     s    z*get_external_downloader.<locals>.<genexpr>N)r8   r9   splitextr   r  r4   nextvalues)external_downloaderr   r  r   get_external_downloader  s   r  )-r   r   r  r8   r   r   r  rv   r1   r   r   r   
networkingr   postprocessor.ffmpegr   r   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   Enumr   r   r   r   r   r   r8  r:  globalsr   r  r  r  r   r   r   r   <module>   s<    <  % J