U
    y^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(   RC:\Users\TaGoRe\Desktop\beinconnect-dl\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 | | |   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_versionZwarningr(   r(   r)   check_version;   s    
   z!FFmpegPostProcessor.check_versionc                 C   s
   t | jS r+   )r*   r4   )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avprober0   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_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, )r;   r<   c                 3   s    | ]}|t j |fV  qd S r+   )osrA   join.0p)locationr(   r)   	<genexpr>y   s    z=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>c                 3   s    | ]}| j | fV  qd S r+   )_pathsrJ   )rE   r.   r(   r)   rN   {   s    c                 3   s   | ]}| |fV  qd S r+   r(   rJ   )rE   r(   r)   rN   ~   s    c                 s   s   | ]}||fV  qd S r+   r(   rJ   r(   r(   r)   rN      s     F)r0   r;   )r;   r0   )r:   r<   )r<   r:   )r3   probe_basenamerO   r4   r5   paramsgetrH   rA   existsr6   isdirsplitextrI   dirnameabspathdict)r.   ZprogramsrF   r3   ZprefsrL   r(   )rE   rM   r.   r)   r-   K   sr    






z*FFmpegPostProcessor._determine_executablesc                 C   s
   | j d k	S r+   )r3   r.   r(   r(   r)   r2      s    zFFmpegPostProcessor.availablec                 C   s   | j | j S r+   )rO   r3   rY   r(   r(   r)   
executable   s    zFFmpegPostProcessor.executablec                 C   s
   | j d k	S r+   )rP   rY   r(   r(   r)   probe_available   s    z#FFmpegPostProcessor.probe_availablec                 C   s   | j | j S r+   )rO   rP   rY   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]+))r[   r2   r   r   r\   r   rZ   append_ffmpeg_filename_argumentr5   rQ   rR   	to_screenr3   r   
subprocessPopenPIPEcommunicatewaitIOErrorOSErrordecodesplit
startswithstripr>   searchr@   )r.   rA   cmdhandleZstdout_dataZstderr_dataZexpected_retoutputZaudio_codeclinerD   r(   r(   r)   get_audio_codec   sT    

  

z#FFmpegPostProcessor.get_audio_codecc                 C   s8  |    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r&|
dd}
|
 dd }t|| ||| d S )Nc                 s   s   | ]}t t|jV  qd S r+   )rH   statr   st_mtime)rK   rA   r(   r(   r)   rN      s    z@FFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<genexpr>r]   Tz-yr;   z	-loglevelzrepeat+infoc                 S   s   g | ]}t |qS r(   )r   )rK   or(   r(   r)   
<listcomp>   s     zAFFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<listcomp>r^   Fz[debug] ffmpeg command line: %s)r`   r_   ra   r   utf-8replacerd   )r8   min_configuration_argsextendr   r   rg   rZ   r3   r5   rQ   rR   rh   r   ri   rj   rk   rl   
returncoderp   rs   rq   r$   	try_utime)r.   Zinput_pathsout_pathoptsZoldest_mtimeZ	files_cmdrA   ru   rL   r`   r_   msgr(   r(   r)   run_ffmpeg_multiple_files   s8    
z-FFmpegPostProcessor.run_ffmpeg_multiple_filesc                 C   s   |  |g|| d S r+   )r   )r.   rA   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)   rg      s    z-FFmpegPostProcessor._ffmpeg_filename_argument)N)N)r%   r&   r'   r,   r8   staticmethodr9   r-   propertyr2   rZ   r[   r\   ry   r   r   rg   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/   preferredcodecpreferredquality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.   rA   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 filetimez!Cannot update utime of audio file)Zerrnote)ry   r   r   r   intACODECS
rpartitionr   rH   rA   rS   r   r5   rh   r   r   r   	Exceptionr3   rR   r   time)r.   informationrA   Z	filecodecr   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/   preferedformat	__class__r(   r)   r,   a  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 %saviz-c:vZlibxvidz-vtagZXVIDr   z[ffmpegz/] Converting video from %s to %s, Destination: format)r   r5   rh   r   r   r   )r.   r   rA   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 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')r5   rh   rR   itemsrf   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  sX    


    

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 d1 f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(|d) d*  7 }|d+|d, d*  7 }|d}|r8|d-|| 7 }q8|	| |
|
 |d.d/g W 5 Q R X | j d0|  | ||| |	rt|
 tt| tt|t| g  fS )2Nc                    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tuplerR   )Z	meta_listZ	info_listZinfo_fZmeta_finfometadatar(   r)   add  s    z!FFmpegMetadataPP.run.<locals>.addtitle)trackr   dateupload_date)descriptioncommentr   ZpurlZwebpage_urlr   Ztrack_numberartist)r   ZcreatorZuploaderZuploader_idZgenreZalbumZalbum_artistZdiscZdisc_numberz([ffmpeg] There isn't any metadata to addr   r   r   r   r   r   r   r   z	-metadataz%s=%schaptersmetawtr~   encodingc                 S   s   t 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)r5   rh   r   r   r   rR   r   ioopenwriterf   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     s^    












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   r5   rh   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| dS dS )Nr0   Tr1   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)r3   r
   r4   r5   r6   r7   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"	rR   r   r5   rh   r   rH   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   *  s    
zFFmpegFixupM4aPP.runNr   r(   r(   r(   r)   r   )  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")	ry   r   r5   rh   r   rH   r   r   r   r   r(   r(   r)   r   <  s    
zFFmpegFixupM3u8PP.runNr   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| | || _d S r+   )r   r   r,   r   )r.   r/   r   r   r(   r)   r,   K  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)dfxpttmlttzpYou have requested to convert dfxp (TTML) subtitles into another format, which results in style information losssrtrbr   r~   r   )r   datar   Zrt)rR   r   r5   rh   r   r   rf   r6   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  sX    





zFFmpegSubtitlesConvertorPP.run)NNr   r(   r(   r   r)   r   J  s   r   )#
__future__r   r   rH   ri   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>   sL   4 Dg:I