3
b`sc                 @   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oggmpegtsasf)
aacr   m4amkamkvZmpgogvtswmawmv
libmp3lamer   ZlibopusZ	libvorbis)mp3r   r   r   opusvorbiswavc               @   s   e Zd ZdS )FFmpegPostProcessorErrorN)__name__
__module____qualname__ r(   r(   KC:\Users\Broad\Desktop\All-Down\binaries\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 j| | | j  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j| d S )Nz/ffmpeg or avconv not found. Please install one.avconvz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-   required_versionwarningr(   r(   r)   check_version;   s    z!FFmpegPostProcessor.check_versionc             C   s
   t | jS )N)r*   r2   )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jdd}jjjd	d k	r,tjj	sjj
d
  i _d S tjj stjjtjj d }||kr؈jj
ddj|f  i _d S tjjtjj|dk rd}tfdd|D _t fdd|D _jd krdt fdd|D _tdd |D _|dkrtd}nd}x"|D ]}j| r~|_ P q~W |dkrd}nd}x"|D ]}j| r|_P qW d S )Navprober/   ffmpegffprobeTc             S   sF   t | dgd}|rBddg}x&|D ]}tj||}|r |jd}q W |S )Nz-version)argsz'(?:\d+:)?([0-9.]+)-[0-9]+ubuntu[0-9.]+$zn([0-9.]+)$r   )r	   rematchgroup)pathverregexsregexmobjr(   r(   r)   get_ffmpeg_versionO   s    
zFFFmpegPostProcessor._determine_executables.<locals>.get_ffmpeg_versionprefer_ffmpeg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, c             3   s    | ]}|t jj |fV  qd S )N)osr@   join).0p)locationr(   r)   	<genexpr>z   s    z=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>c             3   s    | ]}| j | fV  qd S )N)_paths)rJ   rK   )rE   r-   r(   r)   rM   |   s    c             3   s   | ]}| |fV  qd S )Nr(   )rJ   rK   )rE   r(   r)   rM      s    c             s   s   | ]}||fV  qd S )Nr(   )rJ   rK   r(   r(   r)   rM      s    F)r:   r;   )r/   r:   )r:   r/   )r9   r;   )r;   r9   )r1   probe_basenamerN   r2   r3   paramsgetrH   r@   existsr4   isdirsplitextrI   dirnameabspathdict)r-   ZprogramsrF   r1   ZprefsrK   r(   )rE   rL   r-   r)   r,   K   sd    





z*FFmpegPostProcessor._determine_executablesc             C   s
   | j d k	S )N)r1   )r-   r(   r(   r)   r0      s    zFFmpegPostProcessor.availablec             C   s   | j | j S )N)rN   r1   )r-   r(   r(   r)   
executable   s    zFFmpegPostProcessor.executablec             C   s
   | j d k	S )N)rO   )r-   r(   r(   r)   probe_available   s    z#FFmpegPostProcessor.probe_availablec             C   s   | j | j S )N)rN   rO   )r-   r(   r(   r)   probe_executable   s    z$FFmpegPostProcessor.probe_executablec             C   s~  | j  r| j rtdy| j r6t| jdtdg}nt| jdtdg}|jt| j|d | j	j
jddr| j	jd| jt|f  tj|tjtjtjd}|j \}}| j rd	nd
}|j |krd S W n ttfk
r   d S X | j r|n|jdd}| j r^d }xn|jdD ]B}	|	jdr:|	jdd
 j }n|	j dkr|d k	r|S qW ntjd|}
|
rz|
jd
S d S )Nz@ffprobe/avprobe and ffmpeg/avconv not found. Please install one.Tz-show_streamsz-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]+))rY   r0   r   r   rZ   r   rX   append_ffmpeg_filename_argumentr3   rP   rQ   	to_screenr1   r   
subprocessPopenPIPEcommunicatewaitIOErrorOSErrordecodesplit
startswithstripr=   searchr?   )r-   r@   cmdhandleZstdout_dataZstderr_dataZexpected_retoutputZaudio_codeclinerD   r(   r(   r)   get_audio_codec   sF    



z#FFmpegPostProcessor.get_audio_codecc             C   s<  | j   tdd |D }|| j 7 }g }x*|D ]"}|jtdt| j|dg q0W t| jdtdg}| jdkr|tdtdg7 }||d	d
 |D  t| j|dg 7 }| j	j
jddr| j	jdt|  tj|tjtjtjd}|j \}	}
|jdkr*|
jdd}
|
j jdd }t|| j||| d S )Nc             s   s   | ]}t jt|jV  qd S )N)rH   statr   st_mtime)rJ   r@   r(   r(   r)   rM      s    z@FFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<genexpr>z-iTz-yr:   z	-loglevelzrepeat+infoc             S   s   g | ]}t |qS r(   )r   )rJ   or(   r(   r)   
<listcomp>   s    zAFFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<listcomp>r[   Fz[debug] ffmpeg command line: %s)r]   r\   r^   r   zutf-8replacera   r   )r7   min_configuration_argsextendr   r   rd   rX   r1   r3   rP   rQ   re   r   rf   rg   rh   ri   
returncoderm   rp   rn   r$   	try_utime)r-   Zinput_pathsout_pathoptsZoldest_mtimeZ	files_cmdr@   rr   rK   r]   r\   msgr(   r(   r)   run_ffmpeg_multiple_files   s.    

&z-FFmpegPostProcessor.run_ffmpeg_multiple_filesc             C   s   | j |g|| d S )N)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)   rd      s    z-FFmpegPostProcessor._ffmpeg_filename_argument)N)N)r%   r&   r'   r+   r7   staticmethodr8   r,   propertyr0   rX   rY   rZ   rv   r   r   rd   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 j| | |d krd}|| _|| _|| _d S )Nbest)r*   r+   _preferredcodec_preferredquality_nopostoverwrites)r-   r.   preferredcodecpreferredqualitynopostoverwritesr(   r(   r)   r+      s    zFFmpegExtractAudioPP.__init__c             C   sj   |d krg }nd|g}dg| | }yt j| ||| W n, tk
rd } zt|jW Y d d }~X nX d S )Nz-acodecz-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 }| j |}|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 }|jd\}}}	|| | }
|
|d< ||d< |
|ks| jrtj	j
t|
r| jjd|
  g |fS y$| jjd|
  | j||
|| W nT tk
r\ } ztd|j W Y d d }~X n$ tk
r~   td| j Y nX |jdd k	r| j|
tj |d dd |g|fS )!Nfilepathz7WARNING: unable to obtain file audio codec with ffprober   r   r   copyz-bsf:aaac_adtstoascr   r    r"   r!   z-fr   r   r   
   z-q:az-b:akr#   .extz.[ffmpeg] Post-process file %s exists, skippingz[ffmpeg] Destination: zaudio conversion failed: zerror running filetimez!Cannot update utime of audio file)Zerrnote)r   r   )r   r   r    r"   r!   )rv   r   r   r   intACODECS
rpartitionr   rH   r@   rR   r   r3   re   r   r   r   	Exceptionr1   rQ   r   time)r-   informationr@   Z	filecodecr   acodec	extensionprefixsepr   new_pather(   r(   r)   run  sz    
&



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| j| || _d S )N)superr   r+   _preferedformat)r-   r.   preferedformat)	__class__r(   r)   r+   a  s    zFFmpegVideoConvertorPP.__init__c             C   s   |d }|d | j kr4| jjd|| j f  g |fS g }| j dkrT|jddddg |jd	\}}}|| | j  }| jjdd|d | j f  |  | j||| ||d< | j |d< | j |d< |g|fS )Nr   r   zF[ffmpeg] Not converting video file %s - already is in target format %saviz-c:vZlibxvidz-vtagZXVIDr   [r:   z/] Converting video from %s to %s, Destination: formatz[ffmpeg)r   r3   re   r   r   r   )r-   r   r@   optionsr   r   r   Zoutpathr(   r(   r)   r   e  s    
"

zFFmpegVideoConvertorPP.run)NN)r%   r&   r'   r+   r   __classcell__r(   r(   )r   r)   r   `  s   r   c               @   s   e Zd Zdd ZdS )FFmpegEmbedSubtitlePPc             C   s  |d dkr | j jd g |fS |jd}|sB| j jd g |fS |d }|d }g }g }d	}xz|j D ]n\}}	|	d }
|dks|dkr|
d
kr|j| |jt|||
| qh| rh|dkrh|
d
krhd}| j jd qhW |sg |fS |g| }ddddddddg}|d dkr|ddg7 }xRt|D ]F\}}|jdd|d  g tj	|pT|}|jd| d| g q(W t
|d}| j jd|  | j||| tjt| tj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   FvttTz<[ffmpeg] Only WebVTT subtitles can be embedded in webm filesz-map0z-cr   z-0:sz-0:dz-c:sZmov_textz%d:0r   z-metadata:s:s:%dzlanguage=%stempz$[ffmpeg] Embedding subtitles in '%s')r   r   r   )r3   re   rQ   itemsrc   r   	enumerater   r   
short2longr   r   rH   remover   rename)r-   r   	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   x  sN    



zFFmpegEmbedSubtitlePP.runN)r%   r&   r'   r   r(   r(   r(   r)   r   w  s   r   c               @   s   e Zd Zdd ZdS )FFmpegMetadataPPc                s  i d2 fdd	}|dd3 |dd |d4d |d	d
 |dd |dd5 |d |d |d |dd s| j jd g  fS  d }t|d}|g}g } d dkr|jdddg n|jddg x*j D ]\}}|jdd||f g qW  jd g }	|	rt|d!}
tj|
d"d#d$}d%d& }d'}x^|	D ]V}|d(7 }|d)|d* d+  7 }|d,|d- d+  7 }|jd}|r>|d.|| 7 }q>W |j	| |j
|
 |jd/d0g W d Q R X | j jd1|  | j||| |	rtj|
 tjt| tjt|t| g  fS )6Nc                sl   |s| }t | ttfs| f} t |ttfs0|f}x6|D ].} j|d k	r6x| D ]} | |< qNW P q6W d S )N)
isinstancelisttuplerQ   )Z	meta_listZ	info_listZinfo_fZmeta_f)infometadatar(   r)   add  s    

z!FFmpegMetadataPP.run.<locals>.addtitletrackdateupload_datedescriptioncommentZpurlZwebpage_urlZtrack_numberartistcreatoruploaderuploader_idZgenreZalbumZalbum_artistZdiscZdisc_numberz([ffmpeg] There isn't any metadata to addr   r   r   r   z-vnz-acodecr   z-cz	-metadataz%s=%schaptersmetawtzutf-8)encodingc             S   s   t jdd| S )Nz(=|;|#|\\|\n)z\\\1)r=   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
end_timez	title=%s
z-map_metadata1z [ffmpeg] Adding metadata to '%s')N)r   r   )r   r   )r   r   r   r   )r3   re   r   r   r   rQ   r   ioopenwriterc   r   rH   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)   r     s^    













zFFmpegMetadataPP.runN)r%   r&   r'   r   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jd|  | j|d	 || tjt|t| |d	 |fS )
Nr   r   z-cr   z-mapz0:v:0z1:a:0z"[ffmpeg] Merging formats into "%s"Z__files_to_merge)r   r3   re   r   rH   r   r   )r-   r   r   r   r<   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j| dS dS )Nr/   Tz10-0zYour 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)r1   r
   r2   r3   r4   )r-   r5   r6   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   |j d}|d ks|dkr"g |fS |d }t|d}dddd| g}| jjd	|  | j||| tjt| tjt|t| g |fS )
Nstretched_ratior   r   r   z-cr   z-aspectz%fz$[ffmpeg] Fixing aspect ratio in "%s")	rQ   r   r3   re   r   rH   r   r   r   )r-   r   r   r   r   r   r(   r(   r)   r     s    

zFFmpegFixupStretchedPP.runN)r%   r&   r'   r   r(   r(   r(   r)   r     s   r   c               @   s   e Zd Zdd ZdS )FFmpegFixupM4aPPc             C   s|   |j ddkrg |fS |d }t|d}ddddg}| jjd	|  | j||| tjt| tjt|t| g |fS )
N	containerZm4a_dashr   r   z-cr   z-fr   z%[ffmpeg] Correcting container in "%s")	rQ   r   r3   re   r   rH   r   r   r   )r-   r   r   r   r   r(   r(   r)   r   *  s    
zFFmpegFixupM4aPP.runN)r%   r&   r'   r   r(   r(   r(   r)   r   )  s   r   c               @   s   e Zd Zdd ZdS )FFmpegFixupM3u8PPc             C   sx   |d }| j |dkrpt|d}dddddd	g}| jjd
|  | j||| tjt| tjt|t| g |fS )Nr   r   r   z-cr   z-fr   z-bsf:ar   z/[ffmpeg] Fixing malformed AAC bitstream in "%s")	rv   r   r3   re   r   rH   r   r   r   )r-   r   r   r   r   r(   r(   r)   r   <  s    
zFFmpegFixupM3u8PP.runN)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 )FFmpegSubtitlesConvertorPPNc                s   t t| j| || _d S )N)r   r   r+   r   )r-   r.   r   )r   r(   r)   r+   K  s    z#FFmpegSubtitlesConvertorPP.__init__c             C   s  |j d}|d }| j}|}|dkr(d}|d krD| jjd g |fS | jjd g }xJ|j D ]<\}}|d }	|	|kr| jjd|  q`t|||	|j d}
|j|
 t||||j d}|	dkr^| jjd |
}t||d|j d}t|d}t	|j
 }W d Q R X tj|ddd}|j| W d Q R X |}
d|d||< |dkrTq`n
|j| | j|
|d|g tj|ddd}||j
 d||< W d Q R X q`W ||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dfxpttmlttzpYou have requested to convert dfxp (TTML) subtitles into another format, which results in style information losssrtrbr   zutf-8)r   )r   dataz-fZrt)r   r   r   )rQ   r   r3   re   r   r   rc   r4   r   r   readr   r   r   )r-   r   Zsubsr   Znew_extZ
new_formatr   r   r   r   Zold_fileZnew_fileZ	dfxp_fileZsrt_filer   Zsrt_datar(   r(   r)   r   O  sP    





zFFmpegSubtitlesConvertorPP.run)NN)r%   r&   r'   r+   r   r   r(   r(   )r   r)   r   J  s   r   )#
__future__r   r   rH   rf   r   r=   commonr   r   utilsr   r   r	   r
   r   r   r   r   r   r   r   EXT_TO_OUT_FORMATSr   r$   r*   r   r   r   r   r   r   r   r   r   r(   r(   r(   r)   <module>   sH   4 Dg:I