U
    gm                     @   sr  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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(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encodeFilename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   >/tmp/pip-unpacked-wheel-q5ljy6pj/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 | _zXzt }| ||}W n: tk
rn   |dsP d}| d| 	  d Y nX W 5 | jr| | j X |dkr|dt | d}|dkrt
jt|}| || |||d | || d	S | d
 | d| 	 |f  dS d S )Nis_liver   [z] Interrupted by userfinished)filenamestatuselapsed-)downloaded_bytestotal_bytesT
z%s exited with code %dF)Zreport_destinationZ	temp_name_cookies_tempfile
try_removetime_call_downloaderKeyboardInterruptget	to_screenget_basenameospathgetsizer   Z
try_renameupdate_hook_progress	to_stderrreport_error)selfr(   	info_dicttmpfilenamestartedretvalr)   fsizer   r   r   real_download+   sB    


 

 zExternalFD.real_downloadc                 C   s   | j d d  S )N)r   lowerclsr   r   r   r6   T   s    zExternalFD.get_basenamec                 C   s   |   S N)r6   rG   r   r   r   EXE_NAMEX   s    zExternalFD.EXE_NAMEc                 C   s   | j S rI   rJ   )r>   r   r   r   exe\   s    zExternalFD.exeNc                 C   s6   t |d |  fkr| jn|| jg}|s,dS || _|S )NF)r   r6   rJ   AVAILABLE_OPTrL   rH   r8   r   r   r   	available`   s    zExternalFD.availablec              	      s`   t |d ptj jkd|d kp.tj jkt|ddd t  fdd|d dD fS )	NZ	to_stdout+protocol)Zhls_aes.Zextra_param_to_segment_urlZextra_param_to_key_urlc                 3   s   | ]}| j kV  qd S rI   )SUPPORTED_PROTOCOLS).0protorG   r   r   	<genexpr>p   s     z&ExternalFD.supports.<locals>.<genexpr>)allr4   r   r   SUPPORTED_FEATURESr   r   split)rH   r?   r   rG   r   supportsj   s    zExternalFD.supportsc                 C   s   |  |o| |S rI   )rO   rY   )rH   r?   r8   r   r   r   can_downloads   s    zExternalFD.can_downloadc                 C   s   t | j||S rI   )r   params)r>   command_optionparamr   r   r   _optionw   s    zExternalFD._optiontruefalsec                 C   s   t | j|||||S rI   )r   r[   )r>   r\   r]   Z
true_valueZfalse_value	separatorr   r   r   _bool_optionz   s    zExternalFD._bool_optionc                 C   s   t | j|||S rI   )r   r[   )r>   r\   r]   Zexpected_valuer   r   r   _valueless_option}   s    zExternalFD._valueless_optionc                 O   s$   t |  | jd| j|f||S )NZexternal_downloader_args)r
   r6   r[   r4   rJ   )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pZ| jS )Nz.cookiesF)suffixdeletez.[download] Writing temporary cookies file to "")
ydl	cookiejarr(   tempfileNamedTemporaryFileclosenamer/   r5   save)r>   Ztmp_cookiesr   r   r   _write_cookies   s    
zExternalFD._write_cookiesc                 C   s  dd |  ||D }| | d|krP| ||\}}}|rL|rL| | |S | jdd}t| jd| jd| d}|D ]6}	| ||\}}}|s q|r| | t |	_	q~q~|s|j	rd	S | 
|}
| |d
\}}t|d D ]\}}| d| }z| |d\}}W nf tk
rz } zF|rL|dkrL| || W Y $q| d| d|  W Y  d	S d}~X Y nX ||
||  |  | jdds| t| q|  | t| d dS )z. Either overwrite this or implement _make_cmd c                 S   s   g | ]}t |qS r   r   )rS   ar   r   r   
<listcomp>   s     z/ExternalFD._call_downloader.<locals>.<listcomp>	fragmentsskip_unavailable_fragmentsTZfragment_retriesN)
frag_indexfatalwb-Fragrbr   zUnable to open fragment z; Zkeep_fragmentsF
.frag.urlsr   )	_make_cmd
_debug_cmd_call_processr<   r[   r4   r	   Zreport_retry	Exceptionerror	decryptersanitize_open	enumerateOSErrorZreport_skip_fragmentr=   writereadrn   r0   r   )r>   r@   r?   cmd_stderr
returncoderv   Zretry_managerretryZdecrypt_fragmentdestrw   fragmentfragment_filenamesrcerrr   r   r   r2      sR    

 


zExternalFD._call_downloaderc                 C   s   t j|d| jrtjnd dS )NT)textr   )r   run_CAPTURE_STDERR
subprocessPIPE)r>   r   r?   r   r   r   r      s    zExternalFD._call_process)N)N)r_   r`   N)T)N)r   r   r   rR   rW   r   rD   classmethodr6   r   rJ   	functoolscached_propertyrL   rO   rY   rZ   r^   rb   rc   r
   rq   r2   r   r   r   r   r   r    &   s.   )


	




1r    c                   @   s   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 }|r2|d|g7 }|dd k	rl|d  D ]\}}|d| d| g7 }qL|| d	d
dd7 }|| dd7 }|| dd7 }|| dd7 }| dd}t	|dkr|d dkrd|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-atZ
continuedlr+   0z--silent
noprogressz	--verboseverbose--limit-rate	ratelimitz--retryretriesr   r   infZinfiniteZ
2147483647z--max-filesizeZmax_filesize--interfacesource_addressz--proxyproxyz
--insecurenocheckcertificate--)rL   rj   rk   get_cookie_headerr4   itemsrb   rc   r^   lenr
   )r>   r@   r?   r   cookie_headerkeyvalr   r   r   r   r~      s.    zCurlFD._make_cmdN)r   r   r   rM   r   r~   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd ZdS )AxelFDr   c                 C   s   | j d|g}|dd k	rF|d  D ]\}}|d| d| g7 }q&| jj|d }|rp|dd| dg7 }||  7 }|d|d g7 }|S )	Nr   r   z-Hr   r   zCookie: z--max-redirect=0r   )rL   r4   r   rj   rk   r   r
   r>   r@   r?   r   r   r   r   r   r   r   r~      s    zAxelFD._make_cmdNr   r   r   rM   r~   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd ZdS )WgetFD	--versionc           	      C   s   | j d|ddg}| jj|d r2|d|  g7 }|dd k	rl|d  D ]\}}|d| d| g7 }qL|| d	d
7 }| dd}t|dkr|d dkrd|d< ||7 }|| dd7 }| j	d}|rdD ]}|d| d| g7 }q|| 
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_proxyZhttps_proxyz	--execute=z--no-check-certificater   r   )rL   rj   rk   r   rq   r4   r   r^   r   r[   rc   r
   )	r>   r@   r?   r   r   r   r   r   varr   r   r   r~      s*    zWgetFD._make_cmdNr   r   r   r   r   r      s   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$   Zdash_frag_urlsZm3u8_frag_urlsc                    s    dg} fdd|D }t |S )Nz#EXT-X-BYTERANGEc                 3   s   | ]}t |  V  qd S rI   )research)rS   Zfeaturemanifestr   r   rU     s     z-Aria2cFD.supports_manifest.<locals>.<genexpr>)rV   )r   ZUNSUPPORTED_FEATURESZcheck_resultsr   r   r   supports_manifest  s    zAria2cFD.supports_manifestc                 C   s"   t j| r| S dt jj |  S )N.)r7   r8   isabssep)fnr   r   r   _aria2c_filename  s    zAria2cFD._aria2c_filenamec                    s@   dr2d| j dg kr2t pdtt d|d< t ||S )NFzno-external-downloader-progresscompat_optsiJ  )portsecret__rpc)r[   r4   r   struuiduuid4superr2   )r>   r@   r?   	__class__r   r   r2     s
    

zAria2cFD._call_downloaderc                 C   sj  | j ddddddddd	d
g}d|kr2|ddg7 }n|ddg7 }| jj|d rd|d|   g7 }|dd k	r|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$|krP|d%d&|d$ d'  d(|d$ d)  g7 }t
j|}|r||d*| |t
jj g7 }d|kr|d+| t
j|g7 }|d,g7 }d|krV|d-g7 }| d.}g }t|d D ]<\}	}
t
j| d/|	 }|d0|
d | | q| |d1\}}|d2|  |  |d3| |g7 }n|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-s16ru   z--allow-overwrite=truez --allow-piece-length-change=truez--min-split-sizeZ1Mr   z--load-cookies=r   r   r   z--max-overall-download-limitr   r   r   z--all-proxyr   z--check-certificater   r`   r_   r   z--remote-timeZ
updatetimez--show-console-readoutr   r   z--enable-rpcz--rpc-listen-port=r   z--rpc-secret=r   z--dirz--outz--auto-file-renaming=falsez--uri-selector=inorderr}   r{   z
{}
	out={}rz   r.   -ir   )rL   rj   rk   r   rq   r4   r   r^   rb   r
   r7   r8   dirnamer   r   basenamer   appendformatr   r   joinencodern   )r>   r@   r?   r   r   r   dnZurl_list_fileZurl_listrw   r   r   streamr   r   r   r   r~   (  sd          





 zAria2cFD._make_cmdr   c           
   	   C   s   t t }td||d| f|d }td| d|dt| ddd id	}| j	|}t
|}	W 5 Q R X |	d
|kstd|	d S )Nz2.0ztoken:)Zjsonrpcidmethodr[   zhttp://localhost:z/jsonrpczapplication/json)zContent-TypezContent-LengthrV   )dataheadersproxiesr   z$Something went wrong with RPC serverresult)r   r   r   jsondumpsr   r   r   rj   urlopenloadr4   AssertionError)
r>   Zrpc_portZ
rpc_secretr   r[   Zsanitycheckdrequestrrespr   r   r   
aria2c_rpc`  s&    
zAria2cFD.aria2c_rpcc                    s  d|krt  ||S t| j|d d |d d }t }d|k}|rVt|d nd}|dddd|rp|nd |rzdnd d	}| || d
ddd}t	|dt
jt
jd.}	td |	 }
|
d kr|d}|dd|g}|d||d| }|d|}||d||dd }||k r&d }|t|||r<d n|||| |pNd |rht|t|d nd t | d | || |st||kr|d |	 }
qtd |	 }
qd|	j |
fW  5 Q R  S Q R X d S )Nr   r   r   ru   r   	_filenameZdownloadingr   )r(   r)   r*   r,   Zfragment_countfragment_indexF)averagec             
   W   s>   t td ttt|dd| fp$dg}t||r8t|n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.tellStoppedZtotalLengthZcompletedLengthZdownloadSpeed)r,   speedr-   Z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   r?   Zsend_rpcrA   Z
fragmentedZ
frag_countr)   r   prB   activeZ	completed
downloadedr   totalr   r   r   r   t  sV     






	

zAria2cFD._call_process)r   )r   r   r   rM   rR   staticmethodr   r   r2   r~   r   r   __classcell__r   r   r   r   r     s   

	8
r   c                   @   s   e Zd ZdZdZdd ZdS )HttpieFDr   r!   c                 C   st   ddd||d g}| dd k	rJ|d  D ]\}}|| d| g7 }q,| jj|d }|rp|d| g7 }|S )Nr!   z
--downloadz--outputr   r   :zCookie:)r4   r   rj   rk   r   r   r   r   r   r~     s    zHttpieFD._make_cmdN)r   r   r   rM   rJ   r~   r   r   r   r   r    s   r  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rtmpZrtmp_ffmpegmmshttp_dash_segmentsNc                 C   s   t  jS rI   )r   rO   rN   r   r   r   rO     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o8| do8| d o8d| dg ko8| |S )Nrequested_formatsrQ   Zallow_unplayable_formatszno-direct-merger   )r4   rZ   )rH   r?   r[   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r4|d|g7 } qXq4| jdsn|dg7 }|t|d	7 }||d
pg 7 }|d}|d k	r|d|rdndg7 }d }| jd}|rt	d|sd| }|
dr| |   d tj }||d< ||d< |d}	|	dkrR|d}
|d}|d}|d}|d}|d}|dd}|d}|
d k	r|d |
g7 }|d k	r|d!|g7 }|d k	r|d"|g7 }|d k	r|d#|g7 }|d k	r|d$|g7 }|d k	r|d%|g7 }|r|d&d'g7 }t|tr:|D ]}|d(|g7 }q$nt|trR|d(|g7 }|d)p`d*|d+ }}|d,p~|g}t|D ]\}}t	d-|d. }|r| jj|d. ng }|r|d/d0d1d2 |D g |d3r|r|d4d0d5d2 |d3  D g |r.|d6t|g7 }|rH|d7t|| g7 }|| d8|d9  d8fd:|d. f7 }q|s|r| jd;s|d<d=g7 }|d,s|	d>krt|D ].\}}|d?d*}|d@| dA| g q| jdBdr
|dCt| jg7 }|dD }|	dEkr|dFkp0| jdG}|d krF|dH}|rZ|dIdJg7 }nV|dIdKg7 }|jdLkrV|jdMrV|dNr|dN dOd* dPkrV|dQdRg7 }n|	dkr|dIdSg7 }n|dKkr|dFkr|dIdJg7 }nj|dTkrBtt |dU}|dTkr| dV n&| dW| dX |dIt!||g7 }n|dIt!||g7 }|t|dY7 }|| dZ7 }d[d\ |D }|"t#|$|d] | %| t&d^d2 |D }t'|t(j)|d_}|r| *||j+ z|, }W n\ t-k
r@ }  z<t| t.r"t/j0d`kr"|s"|1da n|j2d db  W 5 d } ~ X Y nX |W  5 Q R  S Q R X d S )cN)
downloaderzDm3u8 download detected but ffmpeg could not be found. Please installFz-y)quietr   z	-loglevelr   z-hide_banner)downloader_optionsZffmpeg_args.Z_ffmpeg_args	_seekablez	-seekable1r   r   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.Z
HTTP_PROXYr   rQ   r  
player_urlpage_urlapp	play_pathtc_urlflash_versionZ	rtmp_liveZ	rtmp_connz-rtmp_swfverifyz-rtmp_pageurlz	-rtmp_appz-rtmp_playpathz-rtmp_tcurlz-rtmp_flashverz
-rtmp_livelivez
-rtmp_connZsection_startr   Zsection_endr  z	https?://r   z-cookiesr   c              	   s   s2   | ]*}|j  d |j d|j d|j dV  qdS )r   z; path=z	; domain=z;
N)ro   valuer8   domain)rS   cookier   r   r   rU   5  s   z,FFmpegFD._call_downloader.<locals>.<genexpr>r   z-headersc                 s   s"   | ]\}}| d | dV  qdS )r   z
Nr   )rS   r   r   r   r   r   rU   ;  s     z-ssz-tZ_ir   r   Zforce_keyframes_at_cutsr   copyr  Zmanifest_stream_numberz-mapr  testz-fsext)r
  r  r+   Zhls_use_mpegtsr%   z-fZmpegtsZmp4ZffmpegZneeds_adtstoascZacodecr   )ZaacZmp4az-bsf:aZaac_adtstoascZflvZ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)r  Zffmpeg_args_out.)Z_o1Z_or   c                 S   s   g | ]}t |qS r   rr   )rS   optr   r   r   rt   n  s     z-FFmpegFD._call_downloader.<locals>.<listcomp>Tc                 s   s   | ]}|d  dkV  qdS )r   )r+   zpipe:Nr   )rS   fmtr   r   r   rU   r  s     )r  envwin32   q)timeout)3r   rO   r=   Zcheck_version
executabler[   r4   r   r   match
startswithZreport_warningr6   r7   environr%  
isinstancelistr   r   rj   rk   Zget_cookies_for_urlextendr   r   r
   Z_TEST_FILE_SIZEr   Z	_featuresrX   r   r   r   r   r   Z_ffmpeg_filename_argumentr   anyr   r   r   r  r  r   BaseExceptionr3   sysplatformZcommunicate_or_killkill)!r>   r@   r?   Zffppre   Z	log_levelseekabler*  r   rQ   r  r  r  r  r  r   r!  connentry
start_timeZend_timeZselected_formatsir)  Zis_httpcookiesZstream_numberr'  Z
use_mpegtsZpipedr  rB   er   r   r   r2     s    






















&,


>



zFFmpegFD._call_downloader)N)r   r   r   rR   r   r   r   rW   r   rO   r  r  r2   r   r   r   r   r	    s   
r	  c                   @   s   e Zd ZdS )AVconvFDN)r   r   r   r   r   r   r   rA    s   rA  c                 C   s,   i | ]$\}}| d r|dkr| |qS )ZFD)r    r   )endswithr6   )rS   ro   klassr   r   r   
<dictcomp>  s
   
  rD  c                   C   s   t t S rI   )sorted_BY_NAMErd   r   r   r   r   list_external_downloaders  s    rG  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  kr|V  qd S rI   rK   )rS   rC  Zbnr   r   rU     s    
 z*get_external_downloader.<locals>.<genexpr>N)r7   r8   splitextr   rF  r4   nextvalues)Zexternal_downloaderr   rH  r   get_external_downloader  s    rL  )/r   r   r   r7   r   r   r7  rl   r1   r   r   r   Z
networkingr   Zpostprocessor.ffmpegr   r   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Enumr   r    r   r   r   r   r  r	  rA  globalsr   rF  rG  rL  r   r   r   r   <module>   s<   @  % @