U
    $Pff                     @   sZ  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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 ddd	d
d
dddddd
Zdddddddd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G d%d& d&eZ G d'd( d(eZ!G d)d* d*eZ"dS )+    )unicode_literalsN   )AudioConversionErrorPostProcessor   )encodeArgumentencodeFilenameget_exe_versionis_outdated_versionPostProcessingErrorprepend_extensionshell_quotesubtitles_filenamedfxp2srtISO639Utilsreplace_extensionadtsflacZipodZmatroskaZmpegoggZmpegtsZasf)
aacr   m4aZmkamkvZmpgZogvtsZwmaZwmv
libmp3lamer   ZlibopusZ	libvorbis)mp3r   r   r   opusvorbiswavc                   @   s   e Zd ZdS )FFmpegPostProcessorErrorN)__name__
__module____qualname__ r"   r"   C/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/postprocessor/ffmpeg.pyr   2   s   r   c                   @   s   e Zd ZdddZdd ZedddZdd	 Zed
d Z	edd Z
edd Zedd Zdd Zdd Zdd Zdd ZdS )FFmpegPostProcessorNc                 C   s   t | | |   d S N)r   __init___determine_executables)self
downloaderr"   r"   r#   r&   7   s    zFFmpegPostProcessor.__init__c                 C   sZ   | j std| jdkrdnd}t| j| j |rVd| j| j|f }| jrV| j| d S )Nz/ffmpeg or avconv not found. Please install one.avconv10-0z1.0zZYour copy of %s is outdated, update %s to version %s or newer if you encounter any errors.)	availabler   basenamer
   	_versions_downloaderreport_warningr(   Zrequired_versionwarningr"   r"   r#   check_version;   s    
   z!FFmpegPostProcessor.check_versionc                 C   s
   t | jS r%   )r$   r.   )r)   r"   r"   r#   get_versionsG   s    z FFmpegPostProcessor.get_versionsc                    s  ddddg}d}dd  d _ d _d _d _jr(jjdd}jjd	d k	r(tj	sj
d
  i _d S tjstjtj d }||krֈj
dd|f  i _d S tjtj|dkrd}tfdd|D _t fdd|D _jd kr`t fdd|D _tdd |D _|dkrpd}nd}|D ]}j| rx|_  qqx|dkrd}nd}|D ]}j| r|_ qАqd S )Navprober*   ffmpegffprobeTc                 S   sB   t | dgd}|r>ddg}|D ]}t||}|r|d}q|S )Nz-version)argsz'(?:\d+:)?([0-9.]+)-[0-9]+ubuntu[0-9.]+$zn([0-9.]+)$r   )r	   rematchgroup)pathverZregexsregexmobjr"   r"   r#   get_ffmpeg_versionO   s    zFFFmpegPostProcessor._determine_executables.<locals>.get_ffmpeg_versionprefer_ffmpegZffmpeg_locationzDffmpeg-location %s does not exist! Continuing without avconv/ffmpeg.r   zbCannot identify executable %s, its basename should be one of %s. Continuing without avconv/ffmpeg.z, )r6   r7   c                 3   s    | ]}|t j |fV  qd S r%   )osr<   join.0p)locationr"   r#   	<genexpr>y   s    z=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>c                 3   s    | ]}| j | fV  qd S r%   )_pathsrD   )r@   r(   r"   r#   rH   {   s    c                 3   s   | ]}| |fV  qd S r%   r"   rD   )r@   r"   r#   rH   ~   s    c                 s   s   | ]}||fV  qd S r%   r"   rD   r"   r"   r#   rH      s     F)r*   r6   )r6   r*   )r5   r7   )r7   r5   )r-   probe_basenamerI   r.   r/   paramsgetrB   r<   existsr0   isdirsplitextrC   dirnameabspathdict)r(   ZprogramsrA   r-   ZprefsrF   r"   )r@   rG   r(   r#   r'   K   sr    






z*FFmpegPostProcessor._determine_executablesc                 C   s
   | j d k	S r%   )r-   r(   r"   r"   r#   r,      s    zFFmpegPostProcessor.availablec                 C   s   | j | j S r%   )rI   r-   rS   r"   r"   r#   
executable   s    zFFmpegPostProcessor.executablec                 C   s
   | j d k	S r%   )rJ   rS   r"   r"   r#   probe_available   s    z#FFmpegPostProcessor.probe_availablec                 C   s   | j | j S r%   )rI   rJ   rS   r"   r"   r#   probe_executable   s    z$FFmpegPostProcessor.probe_executablec              	   C   s~  | j s| jstdz| j r2t| jdtdg}nt| jdtdg}|t| |d | j	j
ddr| j	d| jt|f  tj|tjtjtjd}| \}}| j rd	nd
}| |krW d S W n ttfk
r   Y d S X | j r|n|dd}| j r^d }|dD ]F}	|	dr8|	dd
  }n |	 dkr|d k	r|  S qntd|}
|
rz|
d
S d S )Nz@ffprobe/avprobe and ffmpeg/avconv not found. Please install one.Tz-show_streams-iverboseFz[debug] %s command line: %s)stderrstdoutstdinr   r   asciiignore
zcodec_name==zcodec_type=audiozNStream\s*#\d+:\d+(?:\[0x[0-9a-f]+\])?(?:\([a-z]{3}\))?:\s*Audio:\s*([0-9a-z]+))rU   r,   r   r   rV   r   rT   append_ffmpeg_filename_argumentr/   rK   rL   	to_screenr-   r   
subprocessPopenPIPEcommunicatewaitIOErrorOSErrordecodesplit
startswithstripr9   searchr;   )r(   r<   cmdhandleZstdout_dataZstderr_dataZexpected_retoutputZaudio_codecliner?   r"   r"   r#   get_audio_codec   sT    

  

z#FFmpegPostProcessor.get_audio_codecc                 C   sl  |    tdd |D }||  7 }g }|D ]"}|tdt| |dg q.t| jdtdg}| jdkr|tdtdg7 }||d	d
 |D  t| |dg 7 }| j	j
ddr| j	dt|  tj|tjtjtjd}| \}	}
|jdkrZ|
dd}
|
 d}|d }| j	j
ddrR| j	dd|d d   t|| ||| d S )Nc                 s   s   | ]}t t|jV  qd S r%   )rB   statr   st_mtime)rE   r<   r"   r"   r#   rH      s    z@FFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<genexpr>rW   Tz-yr6   z	-loglevelzrepeat+infoc                 S   s   g | ]}t |qS r"   )r   )rE   or"   r"   r#   
<listcomp>   s     zAFFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<listcomp>rX   Fz[debug] ffmpeg command line: %s)rZ   rY   r[   r   utf-8replacer^   z[debug] )r3   minZ_configuration_argsextendr   r   ra   rT   r-   r/   rK   rL   rb   r   rc   rd   re   rf   
returncoderj   rm   rk   rC   r   	try_utime)r(   Zinput_pathsout_pathoptsZoldest_mtimeZ	files_cmdr<   ro   rF   rZ   rY   Zmsgsmsgr"   r"   r#   run_ffmpeg_multiple_files   s>    
z-FFmpegPostProcessor.run_ffmpeg_multiple_filesc                 C   s   |  |g|| d S r%   )r   )r(   r<   r   r   r"   r"   r#   
run_ffmpeg   s    zFFmpegPostProcessor.run_ffmpegc                 C   s   |dkrd| S |S )N-zfile:r"   )r(   fnr"   r"   r#   ra      s    z-FFmpegPostProcessor._ffmpeg_filename_argument)N)N)r   r    r!   r&   r3   staticmethodr4   r'   propertyr,   rT   rU   rV   rs   r   r   ra   r"   r"   r"   r#   r$   6   s"   
I



*#r$   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
FFmpegExtractAudioPPNFc                 C   s.   t | | |d krd}|| _|| _|| _d S )Nbest)r$   r&   _preferredcodec_preferredquality_nopostoverwrites)r(   r)   ZpreferredcodecZpreferredqualityZnopostoverwritesr"   r"   r#   r&      s    zFFmpegExtractAudioPP.__init__c              
   C   sj   |d krg }nd|g}dg| | }zt | ||| W n, tk
rd } zt|jW 5 d }~X Y nX d S )N-acodec-vn)r$   r   r   r   r   )r(   r<   r   codec	more_optsZacodec_optsr   errr"   r"   r#   r     s    zFFmpegExtractAudioPP.run_ffmpegc              
   C   s  |d }|  |}|d kr"tdg }| jdksL| j|ksL| jdkr|dkr|dkrp| jdkrpd}d}dd	g}nt|d
krd}|}|dkrddg}|dkrd}nFd}d}g }| jd k	rt| jdk r|d| jg7 }n|d| jd g7 }nt| j }| j}g }| jd k	rBt| jdk r0|dkr0|d| jg7 }n|d| jd g7 }| jdkrZ|ddg7 }| jdkrr|dd	g7 }| jdkrd}| jdkrd}|ddg7 }|d\}}}	|| | }
|
|d< ||d< |
|ks| jrtj	
t|
r| jd|
  g |fS z$| jd|
  | ||
|| W nT tk
r\ } ztd|j W 5 d }~X Y n$ tk
r~   td| j Y nX |dd k	r| j|
t |d dd |g|fS ) Nfilepathz7WARNING: unable to obtain file audio codec with ffprober   r   r   )r   r   copy-bsf:aaac_adtstoasc)r   r   r   r   r   -fr   r   r   r   r   
   z-q:az-b:akr   r   .extz.[ffmpeg] Post-process file %s exists, skippingz[ffmpeg] Destination: zaudio conversion failed: zerror running Zfiletimez!Cannot update utime of audio file)Zerrnote)rs   r   r   r   intACODECS
rpartitionr   rB   r<   rM   r   r/   rb   r   r   r   	Exceptionr-   rL   r~   time)r(   informationr<   Z	filecodecr   Zacodec	extensionprefixsepr   new_pather"   r"   r#   run  s    
&



  zFFmpegExtractAudioPP.run)NNNF)r   r    r!   r&   r   r   r"   r"   r"   r#   r      s   
r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )FFmpegVideoConvertorPPNc                    s   t t| | || _d S r%   )superr   r&   _preferedformat)r(   r)   Zpreferedformat	__class__r"   r#   r&   d  s    zFFmpegVideoConvertorPP.__init__c                 C   s   |d }|d | j kr4| jd|| j f  g |fS g }| j dkrT|ddddg |d	\}}}|| | j  }| jd
d|d | j f  |  | ||| ||d< | j |d< | j |d< |g|fS )Nr   r   zF[ffmpeg] Not converting video file %s - already is in target format %sZaviz-c:vZlibxvidz-vtagZXVIDr   z[ffmpegz/] Converting video from %s to %s, Destination: format)r   r/   rb   r|   r   r   )r(   r   r<   optionsr   r   r   Zoutpathr"   r"   r#   r   h  s    
"

zFFmpegVideoConvertorPP.run)NNr   r    r!   r&   r   __classcell__r"   r"   r   r#   r   c  s   r   c                   @   s   e Zd Zdd ZdS )FFmpegEmbedSubtitlePPc                 C   s  |d dkr | j d g |fS |d}|sB| j d g |fS |d }|d }g }g }d}| D ]l\}}	|	d }
|dks|dkr|
d	kr|| |t|||
| qf|sf|dkrf|
d	krfd
}| j d qf|sg |fS |g| }ddddddddg}|d dkr|ddg7 }t|D ]F\}}|dd|d  g t	|pL|}|d| d| g q t
|d}| j d|  | ||| tt| tt|t| ||fS )Nr   )mp4webmr   zA[ffmpeg] Subtitles can only be embedded in mp4, webm or mkv filesrequested_subtitlesz,[ffmpeg] There aren't any subtitles to embedr   Fr   vttTz<[ffmpeg] Only WebVTT subtitles can be embedded in webm files-map0-cr   z-0:sz-0:dr   z-c:sZmov_textz%d:0r   z-metadata:s:s:%dzlanguage=%stempz$[ffmpeg] Embedding subtitles in '%s')r/   rb   rL   itemsr`   r   	enumerater|   r   
short2longr   r   rB   remover   rename)r(   r   Z	subtitlesfilenamer   Z	sub_langssub_filenamesZwebm_vtt_warnlangZsub_infoZsub_extZinput_filesr   iZ	lang_codetemp_filenamer"   r"   r#   r   {  sX    


    

zFFmpegEmbedSubtitlePP.runNr   r    r!   r   r"   r"   r"   r#   r   z  s   r   c                   @   s   e Zd Zdd ZdS )FFmpegMetadataPPc              	      s<  i d8 fdd	}|dd |dd |dd |d	d
 |dd |dd |d |d |d |dd |dd |d |dd |dd s| j d g  fS  d }t|d}|g}g } d dkr|d d!d"g n|d#d"g  D ] \}}|d$d%||f g q  d&g }	|	rt|d'}
tj|
d(d)d*}d+d, }d-}|	D ]V}|d.7 }|d/|d0 d1  7 }|d2|d3 d1  7 }|d}|r`|d4|| 7 }q`|	| |
|
 |d5d6g W 5 Q R X | j d7|  | ||| |	rt|
 tt| tt|t| g  fS )9Nc                    sf   |s| }t | ttfs| f} t |ttfs0|f}|D ],} |d k	r4| D ]} | |< qJ qbq4d S r%   )
isinstancelisttuplerL   )Z	meta_listZ	info_listZinfo_fZmeta_finfometadatar"   r#   add  s    z!FFmpegMetadataPP.run.<locals>.addtitle)trackr   dateZupload_date)descriptioncommentr   purlZwebpage_urlr   Ztrack_numberartist)r   ZcreatorZuploaderZuploader_idZgenreZalbumZalbum_artistZdiscZdisc_numbershowZseriesZseason_number
episode_id)Zepisoder   Zepisode_sortZepisode_numberz([ffmpeg] There isn't any metadata to addr   r   r   r   r   r   r   r   z	-metadataz%s=%schaptersmetawtrx   encodingc                 S   s   t dd| S )Nz(=|;|#|\\|\n)z\\\1)r9   sub)textr"   r"   r#   ffmpeg_escape  s    z+FFmpegMetadataPP.run.<locals>.ffmpeg_escapez;FFMETADATA1
z[CHAPTER]
TIMEBASE=1/1000
z	START=%d

start_timei  zEND=%d
Zend_timez	title=%s
z-map_metadata1z [ffmpeg] Adding metadata to '%s')N)r/   rb   r   r|   r   rL   r   ioopenwriter`   r   rB   r   r   r   )r(   r   r   r   r   Zin_filenamesr   namevaluer   Zmetadata_filenamefr   Zmetadata_file_contentZchapterZchapter_titler"   r   r#   r     sf    















zFFmpegMetadataPP.runNr   r"   r"   r"   r#   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )FFmpegMergerPPc                 C   sd   |d }t |d}ddddddg}| jd|  | |d	 || tt|t| |d	 |fS )
Nr   r   r   r   r   z0:v:0z1:a:0z"[ffmpeg] Merging formats into "%s"Z__files_to_merge)r   r/   rb   r   rB   r   r   )r(   r   r   r   r8   r"   r"   r#   r   	  s    
zFFmpegMergerPP.runc                 C   sP   | j dkrdS d}t| j| j  |rLd| j | j |f }| jrH| j| dS dS )Nr*   Tr+   zYour copy of %s is outdated and unable to properly mux separate video and audio files, youtube-dl will download single file media. Update %s to version %s or newer to fix this.F)r-   r
   r.   r/   r0   r1   r"   r"   r#   	can_merge  s"    

   zFFmpegMergerPP.can_mergeN)r   r    r!   r   r   r"   r"   r"   r#   r     s   	r   c                   @   s   e Zd Zdd ZdS )FFmpegFixupStretchedPPc                 C   s   | d}|d ks|dkr"g |fS |d }t|d}dddd| g}| jd	|  | ||| tt| tt|t| g |fS )
Nstretched_ratior   r   r   r   r   z-aspectz%fz$[ffmpeg] Fixing aspect ratio in "%s"	rL   r   r/   rb   r   rB   r   r   r   )r(   r   r   r   r   r   r"   r"   r#   r   %  s    

zFFmpegFixupStretchedPP.runNr   r"   r"   r"   r#   r   $  s   r   c                   @   s   e Zd Zdd ZdS )FFmpegFixupM4aPPc                 C   s|   | ddkrg |fS |d }t|d}ddddg}| jd	|  | ||| tt| tt|t| g |fS )
N	containerZm4a_dashr   r   r   r   r   r   z%[ffmpeg] Correcting container in "%s"r   r(   r   r   r   r   r"   r"   r#   r   8  s    
zFFmpegFixupM4aPP.runNr   r"   r"   r"   r#   r   7  s   r   c                   @   s   e Zd Zdd ZdS )FFmpegFixupM3u8PPc                 C   sx   |d }|  |dkrpt|d}dddddd	g}| jd
|  | ||| tt| tt|t| g |fS )Nr   r   r   r   r   r   r   r   r   z/[ffmpeg] Fixing malformed AAC bitstream in "%s")	rs   r   r/   rb   r   rB   r   r   r   r   r"   r"   r#   r   J  s    
zFFmpegFixupM3u8PP.runNr   r"   r"   r"   r#   r   I  s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )FFmpegSubtitlesConvertorPPNc                    s   t t| | || _d S r%   )r   r   r&   r   )r(   r)   r   r   r"   r#   r&   Y  s    z#FFmpegSubtitlesConvertorPP.__init__c              
   C   s  | d}|d }| j}|}|dkr(d}|d krD| jd g |fS | jd g }| D ]<\}}|d }	|	|kr| jd|  q\t|||	| d}
||
 t|||| d}|	d	krZ| jd
 |
}t||d| d}t|d}t	|
 }W 5 Q R X tj|ddd}|| W 5 Q R X |}
d|d||< |dkrPq\n
|| | |
|d|g tj|ddd}||
 d||< W 5 Q R X q\||fS )Nr   r   r   Zwebvttz.[ffmpeg] There aren't any subtitles to convertz[ffmpeg] Converting subtitlesr   z@[ffmpeg] Subtitle file for %s is already in the requested format)ZdfxpZttmlttzpYou have requested to convert dfxp (TTML) subtitles into another format, which results in style information lossZsrtrbr   rx   r   )r   datar   rt)rL   r   r/   rb   r   r   r`   r0   r   r   readr   r   r   )r(   r   subsr   Znew_extZ
new_formatr   r   r   r   Zold_fileZnew_fileZ	dfxp_fileZsrt_filer   Zsrt_datar"   r"   r#   r   ]  sX    





zFFmpegSubtitlesConvertorPP.run)NNr   r"   r"   r   r#   r   X  s   r   )#
__future__r   r   rB   rc   r   r9   commonr   r   utilsr   r   r	   r
   r   r   r   r   r   r   r   ZEXT_TO_OUT_FORMATSr   r   r$   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   sL   4 Gg:T