a
    hp                     @   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   O/mnt/pikpak/tmp/myenv/lib/python3.9/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 | _zhzt }| ||}W n8 tyl   |dsN d}| d|   d Y n0 W | jr| 	| j n| jr| 	| j 0 |dkr|dt | d}|dkrt
j|}| || |||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time_call_downloaderKeyboardInterruptget	to_screenget_basename
try_removeospathgetsizeZ
try_renameupdate_hook_progress	to_stderrreport_error)selfr'   	info_dicttmpfilenamestartedretvalr(   fsizer   r   r   real_download*   sD    




zExternalFD.real_downloadc                 C   s   | j d d  S )N)r   lowerclsr   r   r   r4   S   s    zExternalFD.get_basenamec                 C   s   |   S N)r4   rF   r   r   r   EXE_NAMEW   s    zExternalFD.EXE_NAMEc                 C   s   | j S rH   rI   )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   r4   rI   AVAILABLE_OPTrK   rG   r7   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 )	NZ	to_stdout+protocol)Zhls_aes.Zextra_param_to_segment_urlZextra_param_to_key_urlc                 3   s   | ]}| j v V  qd S rH   )SUPPORTED_PROTOCOLS).0protorF   r   r   	<genexpr>o       z&ExternalFD.supports.<locals>.<genexpr>)allr2   r   r   SUPPORTED_FEATURESr   r   split)rG   r>   r   rF   r   supportsi   s    zExternalFD.supportsc                 C   s   |  |o| |S rH   )rN   rY   )rG   r>   r7   r   r   r   can_downloadr   s    zExternalFD.can_downloadc                 C   s   t | j||S rH   )r   params)r=   command_optionparamr   r   r   _optionv   s    zExternalFD._optiontruefalsec                 C   s   t | j|||||S rH   )r   r[   )r=   r\   r]   Z
true_valueZfalse_value	separatorr   r   r   _bool_optiony   s    zExternalFD._bool_optionc                 C   s   t | j|||S rH   )r   r[   )r=   r\   r]   Zexpected_valuer   r   r   _valueless_option|   s    zExternalFD._valueless_optionc                 O   s*   t |  | jd| j|g|R i |S )NZexternal_downloader_args)r
   r4   r[   r2   rI   )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.   r3   save)r=   Ztmp_cookiesr   r   r   _write_cookies   s    
zExternalFD._write_cookiesc                 C   s  dd |  ||D }| | d|v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 nh ty| } zN|rN|dkrN| || W Y d}~q| d| d|  W Y d}~ d	S d}~0 0 ||
||  |  | jdds| | q|  | | d dS )z. Either overwrite this or implement _make_cmd c                 S   s   g | ]}t |qS r   r   )rR   ar   r   r   
<listcomp>   rU   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[   r2   r	   Zreport_retry	Exceptionerror	decryptersanitize_open	enumerateOSErrorZreport_skip_fragmentr<   writereadrn   r5   )r=   r?   r>   cmd_stderr
returncoderv   Zretry_managerretryZdecrypt_fragmentdestrw   fragmentfragment_filenamesrcerrr   r   r   r0      sP    




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   rQ   rW   r   rC   classmethodr4   r   rI   	functoolscached_propertyrK   rN   rY   rZ   r^   rb   rc   r
   rq   r0   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 u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v 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--)rK   rj   rk   get_cookie_headerr2   itemsrb   rc   r^   lenr
   )r=   r?   r>   r   cookie_headerkeyvalr   r   r   r   r~      s.    zCurlFD._make_cmdN)r   r   r   rL   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 u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   )rK   r2   r   rj   rk   r   r
   r=   r?   r>   r   r   r   r   r   r   r   r~      s    zAxelFD._make_cmdNr   r   r   rL   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 url|d  D ]\}}|d| d| g7 }qL|| d	d
7 }| dd}t|dkr|d dv 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   )rK   rj   rk   r   rq   r2   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 rH   )research)rR   featuremanifestr   r   rT     rU   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.)r6   r7   isabssep)fnr   r   r   _aria2c_filename  s    zAria2cFD._aria2c_filenamec                    s@   dr2d| j dg vr2t pdtt d|d< t ||S )NFzno-external-downloader-progresscompat_optsiJ  )portsecret__rpc)r[   r2   r   struuiduuid4superr0   )r=   r?   r>   	__class__r   r   r0     s
    

zAria2cFD._call_downloaderc                 C   sj  | j ddddddddd	d
g}d|v r2|ddg7 }n|ddg7 }| jj|d rd|d|   g7 }|dd u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$|v rP|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 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   )rK   rj   rk   r   rq   r2   r   r^   rb   r
   r6   r7   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~   '  sX    






 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 s0    Y  |	d
|ksJ 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loadr2   )
r=   Zrpc_portZ
rpc_secretr   r[   Z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 }|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0}	td |	 }
|
d u 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  d    S 1 s0    Y  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   r/   r   r2   r:   r   r   DEVNULLr   sleeppollr9   intminwaitr   r   )r=   r   r>   Zsend_rpcr@   Z
fragmentedZ
frag_countr(   r   prA   activeZ	completed
downloadedr   totalr   r   r   r   s  sV     






	

zAria2cFD._call_process)r   )r   r   r   rL   rQ   staticmethodr   r   r0   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 urJ|d  D ]\}}|| d| g7 }q,| jj|d }|rp|d| g7 }|S )Nr    z
--downloadz--outputr   r   :zCookie:)r2   r   rj   rk   r   r   r   r   r   r~     s    zHttpieFD._make_cmdN)r   r   r   rL   rI   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 rH   )r   rN   rM   r   r   r   rN     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 vo8| |S )Nrequested_formatsrP   Zallow_unplayable_formatszno-direct-merger   )r2   rZ   )rG   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 u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 ur|d |
g7 }|d ur|d!|g7 }|d ur|d"|g7 }|d ur|d#|g7 }|d ur|d$|g7 }|d u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 ]6\}}t	d-|d. }|r| jj|d. ng }|r|d/d0d1d2 |D g |d3r|r|d4d0d5d2 |d3  D g |r0|d6t|g7 }|rJ|d7t|| g7 }|d. }| jd8r|
d9r|d:d;g7 }td<tjd=krd9nd>|}|g | d?|d@  d?fdA|7 }q|s|r| jdBs|dCdDg7 }|d,s|	dEkr6t|D ].\}}|dFd*}|dG| dH| g q| jdIdrX|dJt| jg7 }|dK }|	dLv r |dMkp~| jdN}|d u r|dO}|r|dPdQg7 }nV|dPdRg7 }|jdSkr|jdTr|dUr|dU  dVd* dWv r|dXdYg7 }n|	dkr|dPdZg7 }n|dRkr:|dMkr:|dPdQg7 }nj|d[krt!t"|d\}|d[krh| d] n&| d^| d_ |dPt#||g7 }n|dPt#||g7 }|t|d`7 }|| da7 }dbdc |D }|$|%| | &| t'ddd2 |D }t(|t)j*|de}|r | +||j, z|- } W n^ t.y }! zDt|!t/rht0j1dfkrh|sh|2dg n|j3d dh  W Y d }!~!n
d }!~!0 0 | W  d    S 1 s0    Y  d S )iN)Z
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   rP   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   valuer7   domain)rR   cookier   r   r   rT   2  s   z,FFmpegFD._call_downloader.<locals>.<genexpr>r   z-headersc                 s   s"   | ]\}}| d | dV  qdS )r   z
Nr   )rR   r   r   r   r   r   rT   8  rU   z-ssz-tZenable_file_urlszfile:z-protocol_whitelistz#file,crypto,data,http,https,tcp,tlsz^file://(?:localhost)?/ntzfile:/Z_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   )rR   optr   r   r   rt   y  rU   z-FFmpegFD._call_downloader.<locals>.<listcomp>c                 s   s   | ]}|d  dv V  qdS )r   )r*   zpipe:Nr   )rR   fmtr   r   r   rT   }  rU   )r  envwin32   q)timeout)4r   rN   r<   Zcheck_version
executabler[   r2   r   r   match
startswithZreport_warningr4   r6   environr%  
isinstancelistr   r   rj   rk   Zget_cookies_for_urlextendr   r   subro   r
   Z_TEST_FILE_SIZEr   Z	_featuresrX   r   r   r   r   Z_ffmpeg_filename_argumentr   anyr   r   r   r  r  r   BaseExceptionr1   sysplatformZcommunicate_or_killkill)"r=   r?   r>   Zffppre   Z	log_levelseekabler*  r   rP   r  r  r  r  r  r  r   connentry
start_timeZend_timeZselected_formatsir)  Zis_httpcookiesr   Zstream_numberr'  Z
use_mpegtsZpipedr  rA   er   r   r   r0     s    






















&,


>



zFFmpegFD._call_downloader)N)r   r   r   rQ   r   r   r   rW   r   rN   r  r  r0   r   r   r   r   r	    s   
r	  c                 C   s,   i | ]$\}}| d r|dvr| |qS )ZFD)r   r   )endswithr4   )rR   ro   klassr   r   r   
<dictcomp>  s   rD  c                   C   s   t t S rH   )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  v r|V  qd S rH   rJ   )rR   rC  Zbnr   r   rT     s   z*get_external_downloader.<locals>.<genexpr>N)r6   r7   splitextr   rF  r2   nextvalues)Zexternal_downloaderr   rH  r   get_external_downloader  s    rL  )-r   r   r   r6   r   r   r8  rl   r/   r   r   r   Z
networkingr   Zpostprocessor.ffmpegr   r   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   Enumr   r   r   r   r   r   r  r	  globalsr   rF  rG  rL  r   r   r   r   <module>   s:   <  % L