U
    $PfD6                     @   s8  d dl m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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 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!e"dd e# $ D Z%dd Z&dd Z'dS )    )unicode_literalsN   )FileDownloader   )compat_setenv
compat_str)FFmpegPostProcessorEXT_TO_OUT_FORMATS)	
cli_optioncli_valueless_optioncli_bool_optioncli_configuration_argsencodeFilenameencodeArgumenthandle_youtubedl_headerscheck_executableis_outdated_versionc                   @   s   e Zd Zdd Zedd Zedd Zedd Zed	d
 Z	edd Z
dd ZdddZdddZg fddZdd ZdS )
ExternalFDc                 C   s   |  | | |}zt }| ||}W n6 tk
rb   |dsH d}| d|    Y nX |dkr|dt | d}|dkrtj	
t|}| d|  |f  | || |||d | | d	S | d
 | d|  |f  dS d S )NZis_liver   z[%s] Interrupted by userfinished)filenamestatuselapsed-z[%s] Downloaded %s bytes)Zdownloaded_bytestotal_bytesT
z%s exited with code %dF)Zreport_destinationZ	temp_nametime_call_downloaderKeyboardInterruptgetZ	to_screenget_basenameospathgetsizer   Z
try_renameupdateZ_hook_progress	to_stderrreport_error)selfr   	info_dicttmpfilenamestartedretvalr   fsize r,   B/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/downloader/external.pyreal_download   s>    





 zExternalFD.real_downloadc                 C   s   | j d d  S )N)__name__lowerclsr,   r,   r-   r   C   s    zExternalFD.get_basenamec                 C   s   | j dS )Nexternal_downloader)paramsr   )r&   r,   r,   r-   exeG   s    zExternalFD.exec                 C   s   t |  | jgS N)r   r   AVAILABLE_OPTr2   r,   r,   r-   	availableK   s    zExternalFD.availablec                 C   s   |d dkS )Nprotocol)httphttpsftpftpsr,   r3   r'   r,   r,   r-   supportsO   s    zExternalFD.supportsc                 C   s   |   o| |S r7   )r9   r@   r?   r,   r,   r-   can_downloadS   s    zExternalFD.can_downloadc                 C   s   t | j||S r7   )r
   r5   )r&   command_optionparamr,   r,   r-   _optionW   s    zExternalFD._optiontruefalseNc                 C   s   t | j|||||S r7   )r   r5   )r&   rB   rC   Z
true_valueZfalse_value	separatorr,   r,   r-   _bool_optionZ   s    zExternalFD._bool_optionTc                 C   s   t | j|||S r7   )r   r5   )r&   rB   rC   Zexpected_valuer,   r,   r-   _valueless_option]   s    zExternalFD._valueless_optionc                 C   s   t | jd|S )NZexternal_downloader_args)r   r5   )r&   defaultr,   r,   r-   _configuration_args`   s    zExternalFD._configuration_argsc                 C   s^   dd |  ||D }| | tj|tjd}| \}}|jdkrX| |dd |jS )z. Either overwrite this or implement _make_cmd c                 S   s   g | ]}t |qS r,   r   .0ar,   r,   r-   
<listcomp>e   s     z/ExternalFD._call_downloader.<locals>.<listcomp>)stderrr   zutf-8replace)		_make_cmd
_debug_cmd
subprocessPopenPIPEcommunicate
returncoder$   decode)r&   r(   r'   cmdp_rQ   r,   r,   r-   r   c   s    
 
zExternalFD._call_downloader)rE   rF   N)T)r0   
__module____qualname__r.   classmethodr   propertyr6   r9   r@   rA   rD   rH   rI   rK   r   r,   r,   r,   r-   r      s    &






r   c                   @   s    e Zd ZdZdd Zdd ZdS )CurlFD-Vc                 C   s  | j dd|g}|d  D ]\}}|dd||f g7 }q|| 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-ohttp_headers--header%s: %sz--continue-atZ
continuedlr   0z--silentZ
noprogressz	--verboseverbose--limit-rate	ratelimitz--retryretriesr   r   infZinfiniteZ
2147483647z--max-filesizeZmax_filesize--interfacesource_address--proxyproxyz
--insecurenocheckcertificate--url)r6   itemsrH   rI   rD   lenrK   r&   r(   r'   r[   keyvalretryr,   r,   r-   rS   t   s&    zCurlFD._make_cmdc                 C   s8   dd |  ||D }| | t|}|  |jS )Nc                 S   s   g | ]}t |qS r,   rL   rM   r,   r,   r-   rP      s     z+CurlFD._call_downloader.<locals>.<listcomp>)rS   rT   rU   rV   rX   rY   )r&   r(   r'   r[   r\   r,   r,   r-   r      s
    

zCurlFD._call_downloaderN)r0   r^   r_   r8   rS   r   r,   r,   r,   r-   rb   q   s   rb   c                   @   s   e Zd ZdZdd ZdS )AxelFDrc   c                 C   sV   | j d|g}|d  D ]\}}|dd||f g7 }q||  7 }|d|d g7 }|S )Nrd   re   z-Hrg   rt   ru   )r6   rv   rK   r&   r(   r'   r[   ry   rz   r,   r,   r-   rS      s    zAxelFD._make_cmdNr0   r^   r_   r8   rS   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}|d  D ]\}}|dd||f g7 }q|| dd7 }| d	d
}t|dkr~|d dkrvd|d< ||7 }|| dd7 }|| dd7 }|| dd7 }||  7 }|d|d g7 }|S )Nz-Oz-nvz--no-cookiesre   rf   rg   rj   rk   z--triesrl   r   r   rm   rh   z--bind-addressrp   rq   rr   z--no-check-certificaters   rt   ru   )r6   rv   rD   rw   rI   rK   rx   r,   r,   r-   rS      s    zWgetFD._make_cmdNr~   r,   r,   r,   r-   r      s   r   c                   @   s   e Zd ZdZdd ZdS )Aria2cFDz-vc                 C   s   | j dg}|| ddddg7 }tj|}|r<|d|g7 }|dtj|g7 }|d  D ]\}}|d	d
||f g7 }q\|| dd7 }|| dd7 }|| ddddd7 }|| ddddd7 }|d|d g7 }|S )N-cz--min-split-sizeZ1Mz--max-connection-per-server4z--dirz--outre   rf   rg   ro   rp   z--all-proxyrr   z--check-certificaters   rF   rE   =z--remote-timeZ
updatetimert   ru   )	r6   rK   r    r!   dirnamebasenamerv   rD   rH   )r&   r(   r'   r[   dnry   rz   r,   r,   r-   rS      s&    
   zAria2cFD._make_cmdNr~   r,   r,   r,   r-   r      s   r   c                   @   s    e Zd Zedd Zdd ZdS )HttpieFDc                 C   s   t ddgS )Nr;   r   )r   r2   r,   r,   r-   r9      s    zHttpieFD.availablec                 C   s>   ddd||d g}|d   D ]\}}|d||f g7 }q|S )Nr;   z
--downloadz--outputru   re   z%s:%s)rv   r}   r,   r,   r-   rS      s    zHttpieFD._make_cmdN)r0   r^   r_   r`   r9   rS   r,   r,   r,   r-   r      s   
r   c                   @   s,   e Zd Zedd Zedd Zdd ZdS )FFmpegFDc                 C   s   |d dkS )Nr:   )r;   r<   r=   r>   m3u8rtsprtmpmmsr,   r?   r,   r,   r-   r@      s    zFFmpegFD.supportsc                 C   s   t  jS r7   )r   r9   r2   r,   r,   r-   r9      s    zFFmpegFD.availablec                 C   s  |d }t | d}|js&| d dS |  |jdg}dD ]"}| j|dr<|d|g7 } q`q<|d}|d k	r|d	|r~d
ndg7 }||  7 }|d rt	d|rt
|d }|dddd | D g7 }d }	| jd}
|
r@t	d|
sd|
 }
|
dr| d|    tj }	td|
|	d td|
|	d |d}|dkrz|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rb|D ]}|d,|g7 }qLnt|trz|d,|g7 }|d-|d.d/g7 }| jd0dr|d1t| jg7 }|d2kr<| jd3ds|d4kr|d5d6g7 }n\|d5d7g7 }|jd8krpt|jd8 d9drp|d:r.|d: d;d< d=krp|d>d?g7 }n4|dkrT|d5d@g7 }n|d5t|dA |dA g7 }dBdC |D }|t||dD |  | t!j"|t!j#|	dE}z|$ }W n. t%k
r   t&j'dFkr|(dG  Y nX |S )HNru   )
downloaderzSm3u8 download detected but ffmpeg or avconv could not be found. Please install one.Fz-y)quietri   z	-loglevel	_seekablez	-seekable1rh   re   z
^https?://z-headers c                 s   s   | ]\}}d ||f V  qdS )z%s: %s
Nr,   )rN   ry   rz   r,   r,   r-   	<genexpr>  s     z,FFmpegFD._call_downloader.<locals>.<genexpr>rr   z^[\da-zA-Z]+://z	http://%ssockszv%s does not support SOCKS proxies. Downloading is likely to fail. Consider adding --hls-prefer-native to your command.Z
HTTP_PROXY)envZ
http_proxyr:   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-ir   copytestz-fs)r   Zm3u8_nativeZhls_use_mpegtsr   z-fZmpegtsZmp4Zffmpegz3.2Zacodec.r   )ZaacZmp4az-bsf:aZaac_adtstoascZflvextc                 S   s   g | ]}t |qS r,   rL   )rN   optr,   r,   r-   rP   K  s     z-FFmpegFD._call_downloader.<locals>.<listcomp>T)stdinr   win32   q))r   r9   r%   Zcheck_version
executabler5   r   rK   rematchr   joinrv   
startswithZreport_warningr   r    environr   r   
isinstancelistr   Z_TEST_FILE_SIZEr   r   Z	_versionssplitr	   appendr   Z_ffmpeg_filename_argumentrT   rU   rV   rW   waitr   sysplatformrX   )r&   r(   r'   ru   ZffppargsZ	log_levelseekableheadersr   rr   r:   r   r   r   r   r   r   r   connentryprocr*   r,   r,   r-   r      s    



	
















D


zFFmpegFD._call_downloaderN)r0   r^   r_   r`   r@   r9   r   r,   r,   r,   r-   r      s
   

r   c                   @   s   e Zd ZdS )AVconvFDN)r0   r^   r_   r,   r,   r,   r-   r   _  s   r   c                 c   s0   | ](\}}| d r|dkr| |fV  qdS )ZFDr   N)endswithr   )rN   nameklassr,   r,   r-   r   c  s   
 r   c                   C   s   t t S r7   )sorted_BY_NAMEkeysr,   r,   r,   r-   list_external_downloadersj  s    r   c                 C   s    t jt j| d }t| S )zY Given the name of the executable, see whether we support the given
        downloader . r   )r    r!   splitextr   r   )r4   Zbnr,   r,   r-   get_external_downloadern  s    r   )(
__future__r   os.pathr    r   rU   r   r   commonr   compatr   r   Zpostprocessor.ffmpegr   r	   utilsr
   r   r   r   r   r   r   r   r   r   rb   r|   r   r   r   r   r   dictglobalsrv   r   r   r   r,   r,   r,   r-   <module>   s.   ,U# 
