a
    hz                     @   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	m
Z
 ddl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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ddZ"dddddddddZ#dd Z$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/d0 d0e'Z.G d1d2 d2e.Z/G d3d4 d4e.Z0G d5d6 d6e.Z1G d7d8 d8e.Z2G d9d: d:e.Z3G d;d< d<e3Z4G d=d> d>e3Z5G d?d@ d@e'Z6G dAdB dBe'Z7G dCdD dDe'Z8G dEdF dFe'Z9dS )G    N   )PostProcessor   )imghdr)MEDIA_EXTENSIONSISO639UtilsPopenPostProcessingError_get_exe_version_outputdeprecation_warningdetect_exe_versiondetermine_extdfxp2srtencodeArgumentfilter_dictfloat_or_noneis_outdated_version
orderedSetprepend_extensionreplace_extensionshell_quotetraverse_objvariadicwrite_json_fileadtsflacZipodZmatroskaZmpegoggmpegtsZasfwebmwebvtt)aacr   m4amkamkvZmpgZogvtswmaZwmvZwebavtt)mp3
libmp3lame )r!   r    )-fr   )r!   r    )-bsf:aaac_adtstoasc)opusZlibopusr)   )r   	libvorbisr)   )r   r   r)   )r!   N)-acodecalac)wavN)r*   r1   )r'   r    r!   r-   vorbisr   r0   r1   c              	   C   s   t ddd| S )Nz{0}(?:/{0})*$z(?:\s*\w+\s*>)?\s*(?:{})\s*|)recompileformatjoin)	supportedr)   r)   P/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/postprocessor/ffmpeg.pycreate_mapping_re?   s    r:   c                 C   s|   |  dD ]^}|dd}t|dks:|d  | kr|d  }|| kr`|d|  f  S |df  S qdd|  fS )	zo
    Get corresponding item from a mapping string like 'A>B/C>D/E'
    @returns    (target, error_message)
    />r   r   zalready is in target format Nzcould not find a mapping for )lowersplitlenstrip)sourcemappingpairkvtargetr)   r)   r9   resolve_mappingC   s    rG   c                   @   s   e Zd ZdS )FFmpegPostProcessorErrorN)__name__
__module____qualname__r)   r)   r)   r9   rH   R   s   rH   c                   @   s  e Zd ZejdddZdGddZedHddZedIdd	Z	d
d Z
ddii  ZZdd Zedd Zejdd Zejdd Zdd Zejdd Zejdd Zedd Zedd Zedd Zed d! ZedJdd#d$d%Zd&d' Zd(d) Zg fd*d+Zd,d- Zd.d/ Z dKd0d1Z!dLd3d4Z"d5d6 Z#d7d8d9d:Z$d;d< Z%ed=d> Z&ed?d@ Z'dAdB Z(dMdCdDZ)e*dNdEdFZ+dS )OFFmpegPostProcessorffmpeg_locationN)defaultc                 C   s   t | | |  | _d S N)r   __init___determine_executables_paths)self
downloaderr)   r)   r9   rP   Y   s    zFFmpegPostProcessor.__init__c                 C   s   t | }|j|jfS rO   )rL   	_versions	_features)rT   ppr)   r)   r9   get_versions_and_features]   s    z-FFmpegPostProcessor.get_versions_and_featuresc                 C   s   t | d S )Nr   )rL   rX   )rT   r)   r)   r9   get_versionsb   s    z FFmpegPostProcessor.get_versionsc                    s  ddg}|  d| j }|d u r0dd |D S tj|sV| jd| ddd	 i S tj|rt|d d    }n8tj|t	fd
d|D d}tj
tj|  fdd|D }|r|v r|D ].}tj ||}tj|r|||< q|r|||< |S )NffmpegffproberM   c                 S   s   i | ]
}||qS r)   r)   .0pr)   r)   r9   
<dictcomp>k       z>FFmpegPostProcessor._determine_executables.<locals>.<dictcomp>zffmpeg-location z* does not exist! Continuing without ffmpegT)Z	only_oncec                 3   s   | ]}| v r|V  qd S rO   r)   r\   )filenamer)   r9   	<genexpr>u   r`   z=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>c                    s   i | ]}|t j |qS r)   )ospathr7   r\   )dirnamer)   r9   r_   x   r`   )	get_param_ffmpeg_locationgetrc   rd   existsreport_warningisdirbasenamenextre   abspathr7   replace)rS   Zprogramslocationrl   pathsr^   rd   r)   )re   ra   r9   rQ   f   s.    
z*FFmpegPostProcessor._determine_executablesc           
      C   s   | j |}|| jv r.| j| | j|i fS t|dg}|rFt|nd}|rzddg}|D ]}t||}|rZ|d}qZ|| j|< |dks|s|i fS t	d|}|r|d
d	d
nd }d|v d| v t|ddd | j|< }	||	fS )Nz-bsfsFz'(?:\d+:)?([0-9.]+)-[0-9]+ubuntu[0-9.]+$zn([0-9.]+)$r   rZ   z>(?m)^\s+libavformat\s+(?:[0-9. ]+)\s+/\s+(?P<runtime>[0-9. ]+)Zruntime  z--enable-libfdk-aacsettsz	57.56.100)fdkrt   Zneeds_adtstoasc)rR   rh   _version_cache_features_cacher
   r   r4   matchgroupsearchro   
splitlinesr   )
rS   progrd   outverZregexsregexmobjZlavf_runtime_versionfeaturesr)   r)   r9   _get_ffmpeg_version   s.    



z'FFmpegPostProcessor._get_ffmpeg_versionc                 C   s   t | j| j| j| jiS rO   )r   rl   _versionprobe_basename_probe_versionrS   r)   r)   r9   rU      s    zFFmpegPostProcessor._versionsc                 C   s   | j }| jS rO   )r   rl   rS   _r)   r)   r9   rl      s    zFFmpegPostProcessor.basenamec                 C   s   | j }| jS rO   )r   r   r   r)   r)   r9   r      s    z"FFmpegPostProcessor.probe_basenamec                    sV   |f}t tdd  fdd|D d d i f\}}}|dkrL||  _ _n| _|S )Nc                 S   s   | d S Nr   r)   )xr)   r)   r9   <lambda>   r`   z2FFmpegPostProcessor._get_version.<locals>.<lambda>c                 3   s    | ]}|g  |R V  qd S rO   )r   r\   r   r)   r9   rb      r`   z3FFmpegPostProcessor._get_version.<locals>.<genexpr>rZ   )rm   filterrl   rV   r   )rS   kindZexecutablesrl   versionr   r)   r   r9   _get_version   s    
z FFmpegPostProcessor._get_versionc                 C   s
   |  dS )NrZ   r   r   r)   r)   r9   r      s    zFFmpegPostProcessor._versionc                 C   s
   |  dS )Nr[   r   r   r)   r)   r9   r      s    z"FFmpegPostProcessor._probe_versionc                 C   s   t | j p| jd uS rO   )boolrg   rh   rl   r   r)   r)   r9   	available   s    zFFmpegPostProcessor.availablec                 C   s   | j | jS rO   )rR   rh   rl   r   r)   r)   r9   
executable   s    zFFmpegPostProcessor.executablec                 C   s
   | j d uS rO   )r   r   r)   r)   r9   probe_available   s    z#FFmpegPostProcessor.probe_availablec                 C   s   | j | jS rO   )rR   rh   r   r   r)   r)   r9   probe_executable   s    z$FFmpegPostProcessor.probe_executableTextc                c   s8   dE d H  dE d H  | r"dE d H  |dv r4dE d H  d S )N)-map0)z-dnz-ignore_unknown)-ccopy)mp4movr!   )z-c:sZmov_textr)   )r   r   r)   r)   r9   stream_copy_opts   s    


z$FFmpegPostProcessor.stream_copy_optsc              	   C   sD   | j stdd}t| j|r@| d| j d| j d| d d S )NzLffmpeg not found. Please install or provide the path using --ffmpeg-locationz1.0zYour copy of z is outdated, update z to version z% or newer if you encounter any errors)r   rH   r   r   rj   rl   )rS   Zrequired_versionr)   r)   r9   check_version   s    z!FFmpegPostProcessor.check_versionc           
      C   s:  | j s| jstdz| j r,| jtdg}n| jtdg}|| | | | j	 dt
|  tj|dtjtjtjd\}}}|| j rdndkrW d S W n ty   Y d S 0 | j r|n|}| j rd }|d	D ]>}|d
r|dd  }q| dkr|d ur|  S qntd|}	|	r6|	dS d S )NzXffprobe and ffmpeg not found. Please install or provide the path using --ffmpeg-location-show_streams-iz command line: T)textstdinstdoutstderrr   r   
zcodec_name==zcodec_type=audiozNStream\s*#\d+:\d+(?:\[0x[0-9a-f]+\])?(?:\([a-z]{3}\))?:\s*Audio:\s*([0-9a-z]+))r   r   r	   r   r   r   append_ffmpeg_filename_argumentwrite_debugrl   r   r   run
subprocessPIPEOSErrorr?   
startswithrA   r4   rz   ry   )
rS   rd   cmdr   r   
returncodeoutputZaudio_codecliner   r)   r)   r9   get_audio_codec   sD    


z#FFmpegPostProcessor.get_audio_codecc                 C   s   | j dkr"| jr| d td|   | jtdtdtdtdtdg}||7 }|| | | 	d	t
|  tj|d
tjtjtjd\}}}t|S )Nr[   z1Only ffprobe is supported for metadata extractionzMffprobe not found. Please install or provide the path using --ffmpeg-location-hide_bannerz-show_formatr   z-print_formatjsonzffprobe command line: Tr   r   r   r   )r   r   rj   r	   r   r   r   r   r   r   r   r   r   r   r   r   loads)rS   rd   optsr   r   r   r)   r)   r9   get_metadata_object
  s"    

	 z'FFmpegPostProcessor.get_metadata_objectc                    s8   |  |d }t fddt|D d }|t|fS )Nstreamsc                 3   s(   | ] \}}t | d dkr|V  qdS )FZ	casesenseN)r   )r]   istreamkeysvaluer)   r9   rb   #  r`   z8FFmpegPostProcessor.get_stream_number.<locals>.<genexpr>)r   rm   	enumerater@   )rS   rd   r   r   r   numr)   r   r9   get_stream_number   s    z%FFmpegPostProcessor.get_stream_numberc                 C   s.   t |d}|r*|ds*| |d |d< d S )N)chaptersr=   end_timefilepath)r   rh   _get_real_video_duration)rS   infoZlast_chapterr)   r)   r9   _fixup_chapters'  s    
z#FFmpegPostProcessor._fixup_chaptersc              
   C   sd   z&t t| |d}|s"td|W S  ty^ } z |rJtd|j W Y d }~n
d }~0 0 d S )N)r6   durationzffprobe returned empty durationz$Unable to determine video duration: )r   r   r   r	   msg)rS   r   fatalr   er)   r)   r9   r   ,  s    z,FFmpegPostProcessor._get_real_video_durationr   c                 C   s   |r|sd S t || |kS rO   )abs)rS   d1Zd2Z	tolerancer)   r)   r9   _duration_mismatch7  s    z&FFmpegPostProcessor._duration_mismatchc                 K   s$   | j dd |D ||fgfi |S )Nc                 S   s   g | ]}|g fqS r)   r)   )r]   rd   r)   r)   r9   
<listcomp>@  r`   zAFFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<listcomp>)real_run_ffmpeg)rS   Zinput_pathsout_pathr   kwargsr)   r)   r9   run_ffmpeg_multiple_files>  s    z-FFmpegPostProcessor.run_ffmpeg_multiple_files)r   )expected_retcodesc                   s     tdd |D }jtdg}jdkrF|tdtdg7 }fddd	|fd
|ffD ],\ }|tj fddt|D 7 }qb	dt
|  tj|dtjtjtjd\}}}	|	t|vr	| t|  d |D ]\}
}|
r|
|| q|S )Nc                 s   s"   | ]\}}|rt |jV  qd S rO   )rc   statst_mtime)r]   rd   r   r)   r)   r9   rb   F  s   z6FFmpegPostProcessor.real_run_ffmpeg.<locals>.<genexpr>z-yrZ   z	-loglevelzrepeat+infoc                    s|   d| | d| g}|dkr>|ddg7 }|dkr>| d |  j|7 }|dkrb| d d	d
 |D  | g S )Nr   oz	-movflagsz
+faststartr   rs   r   r   c                 S   s   g | ]}t |qS r)   )r   )r]   argr)   r)   r9   r   X  r`   zJFFmpegPostProcessor.real_run_ffmpeg.<locals>.make_args.<locals>.<listcomp>)r   Z_configuration_argsrl   r   )fileargsnamenumberr   r   r)   r9   	make_argsN  s    


z6FFmpegPostProcessor.real_run_ffmpeg.<locals>.make_argsr   r   c                 3   s0   | ](\}\}}|r|t | |d  V  qdS )r   N)list)r]   r   rd   r   )arg_typer   r)   r9   rb   \  s   zffmpeg command line: Tr   r=   )r   minr   r   rl   	itertoolschainfrom_iterabler   r   r   r   r   r   r   r   rH   rA   r{   	try_utime)rS   Zinput_path_optsZoutput_path_optsr   Zoldest_mtimer   Z	path_optsr   r   r   r   r)   )r   r   rS   r9   r   C  s.    

z#FFmpegPostProcessor.real_run_ffmpegc                 K   s   | j |g||fi |S rO   )r   )rS   rd   r   r   r   r)   r)   r9   
run_ffmpegk  s    zFFmpegPostProcessor.run_ffmpegc                 C   s"   |  dr| S | dkrd|  S | S )N)zhttp://zhttps://-zfile:)r   )fnr)   r)   r9   r   n  s    
z-FFmpegPostProcessor._ffmpeg_filename_argumentc                 C   sT   |  dd dd} | d dkr,| dd  nd|  } | d dkrL| d d S | d S )N'z'\''z'''r   r   r=   )ro   )stringr)   r)   r9   _quote_for_ffmpegx  s     z%FFmpegPostProcessor._quote_for_ffmpegc              	   C   sx   t |}|d dkr |dd  }t|d}| d| d | ||g | jdt|ddd	d
d |D  |S )Nr   r   zkeyframes.tempzRe-encoding "z" with appropriate keyframesFr   z-force_key_frames,c                 s   s   | ]}|d V  qdS )z.6fNr)   )r]   tr)   r)   r9   rb     r`   z6FFmpegPostProcessor.force_keyframes.<locals>.<genexpr>)r   r   	to_screenr   r   r   r7   )rS   ra   Z
timestampsZkeyframe_filer)   r)   r9   force_keyframes  s    

z#FFmpegPostProcessor.force_keyframesc                 C   s   | d}|  d|  t|ddd"}|| || W d   n1 sP0    Y  t| jt|d}| |g dfg||fg | | dS )	z
        Use concat demuxer to concatenate multiple files having identical streams.

        Only inpoint, outpoint, and duration concat options are supported.
        See https://ffmpeg.org/ffmpeg-formats.html#concat-1 for details
        z.concatzWriting concat spec to wutf-8encodingNr   )r   z-nostdinr*   concatz-safer   )	r   open
writelines_concat_specr   r   r   r   _delete_downloaded_files)rS   in_filesout_fileconcat_optsZconcat_filefZ	out_flagsr)   r)   r9   concat_files  s    
0z FFmpegPostProcessor.concat_filesc                 c   sv   |d u ri gt | }dV  t||D ]J\}}d| | | dV  dD ]"}||v rL| d||  dV  qLq&d S )Nzffconcat version 1.0
zfile r   )ZinpointZoutpointr   rr   )r@   zipr   r   )clsr   r   r   r   	directiver)   r)   r9   r     s    z FFmpegPostProcessor._concat_spec)N)N)N)T)T)r   )N)N),rI   rJ   rK   contextvarsZ
ContextVarrg   rP   staticmethodrX   rY   rQ   rv   rw   r   propertyrU   	functoolscached_propertyrl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r)   r)   r)   r9   rL   V   s`   











	%

(
	
	
rL   c                   @   sf   e Zd Zg ejdR Zee Z	e
dge	R ZdddZdd Zd	d
 Zejdddd ZdS )FFmpegExtractAudioPPr%   bestNFc                 C   s*   t | | |pd| _t|| _|| _d S )Nr
  )rL   rP   rC   r   _preferredquality_nopostoverwrites)rS   rT   ZpreferredcodecZpreferredqualityZnopostoverwritesr)   r)   r9   rP     s    

zFFmpegExtractAudioPP.__init__c                 C   s   | j d u rg S | j dkr(d| j  dgS ddddd|}|sDg S |d	 |d
 |d	  | j d   }|dkr|dt| gS d| gS )N
   z-b:ak)r  r   )r   r  )g?   )r      )r(   r.   r    
libfdk_aacr   r   r  z-vbrz-q:a)r  rh   int)rS   codecZlimitsqr)   r)   r9   _quality_args  s"    

"z"FFmpegExtractAudioPP._quality_argsc              
   C   sr   |d u rg }nd|g}dg||}zt | ||| W n4 tyl } ztd|j W Y d }~n
d }~0 0 d S )Nr/   -vnzaudio conversion failed: )rL   r   rH   r	   r   )rS   rd   r   r  	more_optsZacodec_optsr   errr)   r)   r9   r     s    zFFmpegExtractAudioPP.run_ffmpegimagesc                 C   sX  |d  }}t |d | j\}}|dkr>|d | jv r>d\}}|s`| d| d|  g |fS | |}|d u rztd|dkr|d	v rg td
 dR \}}}	}
n|dks||krzg t| dR \}}}	}
W n  ty   td \}}
}	Y n0 n0t| \}}
}	|
dkr(| j	dr(dg  }
}	t
|	}	|
dkrD| |
}	t|||d  }}||kr|
dkr| d| d|  g |fS t|d}t|d}| jrtj|rtj|r| d| d g |fS | d|  | |||
|	 t|| t|| ||d< ||d< |	dd urN| j|t |d dd |g|fS )Nr   r   r
  )Nz,the file is already in a common audio formatzNot converting audio z; z7WARNING: unable to obtain file audio codec with ffprober    )r!   r
  r!   r   r'   ru   r  z#; file is already in target format origtempzPost-process file z exists, skippingzDestination: Zfiletimez!Cannot update utime of audio file)Zerrnote)rG   rC   COMMON_AUDIO_EXTSr   r   r	   ACODECSKeyErrorrV   rh   r   r  r   r   r  rc   rd   ri   r   ro   r   time)rS   information	orig_pathrd   Ztarget_format	_skip_msgZ	filecodec	extensionr   r  acodecZ	temp_pathnew_pathr)   r)   r9   r     s\    








zFFmpegExtractAudioPP.run)NNNF)rI   rJ   rK   r   common_audior  tupler  r   SUPPORTED_EXTSr:   	FORMAT_RErP   r  r   r   _restrict_tor   r)   r)   r)   r9   r	    s   

r	  c                       s|   e Zd Zg eg ejdR eg ejddR R ZeeZ	dZ
d fdd	Zedd	 Zejd
ddd Z  ZS )FFmpegVideoConvertorPPZgifr    r2   Z
convertingNc                    s   t  | || _d S rO   superrP   rC   )rS   rT   Zpreferedformat	__class__r)   r9   rP     s    zFFmpegVideoConvertorPP.__init__c                 c   s&   t dE d H  | dkr"dE d H  d S )NFZavi)z-c:vZlibxvidz-vtagZXVIDrL   r   
target_extr)   r)   r9   _options#  s    zFFmpegVideoConvertorPP._optionsFr  c              	   C   s   |d |d    }}t|| j\}}|rP| d| j d| d|  g |fS t|||}| | j  d| d| d|  | ||| | ||d< | |d	< |d< |g|fS )
Nr   r   zNot z media file ""; z video from z to z; Destination: r6   )	r>   rG   rC   r   _ACTIONr   titler   r4  )rS   r   ra   
source_extr3  r#  Zoutpathr)   r)   r9   r   )  s    &zFFmpegVideoConvertorPP.run)NN)rI   rJ   rK   sortedr   common_videor'  r)  r:   r*  r6  rP   r  r4  r   r+  r   __classcell__r)   r)   r/  r9   r,    s   

r,  c                   @   s   e Zd ZdZedd ZdS )FFmpegVideoRemuxerPPZremuxingc                 C   s   t  S rO   r1  r2  r)   r)   r9   r4  =  s    zFFmpegVideoRemuxerPP._optionsN)rI   rJ   rK   r6  r  r4  r)   r)   r)   r9   r<  :  s   r<  c                       s6   e Zd ZdZd	 fdd	Zejdddd Z  ZS )
FFmpegEmbedSubtitlePP)r   r   r!   r   r#   r"   NFc                    s   t  | || _d S rO   )r.  rP   _already_have_subtitle)rS   rT   Zalready_have_subtitler/  r)   r9   rP   E  s    zFFmpegEmbedSubtitlePP.__init__r  c                 C   sp  |d | j vr0| dd| j  d g |fS |d}|sP| d g |fS |d }|d }g g g   }}}d}d}	| D ]\}
}tj|dd	s| d
|
 d q|d }|dkr| d nn|dks|dkr|dkr|	|
 |	|d |	|d  n(|s:|dkr:|dkr:d}| d |	s|dkr|dkrd}	| d q|slg |fS |g|}g | j
|d ddd}tt||D ]\}\}
}|d|d  dg t|
p|
}|d| d| g |r|d| d| d| d| g qt|d}| d | d! | ||| t|| | jrdg n|}||fS )"Nr   z"Subtitles can only be embedded in , z filesrequested_subtitlesz#There aren't any subtitles to embedr   Frs   Skipping embedding % subtitle because the file is missingr   z!JSON subtitles cannot be embeddedr   r&   r   Tz3Only WebVTT subtitles can be embedded in webm filesr   ZasszEASS subtitles cannot be properly embedded in mp4 files; expect issuesr   r   z-0:sr   z:0z-metadata:s:s:z	language=zhandler_name=title=r  zEmbedding subtitles in "")r)  r   r7   rh   itemsrc   rd   ri   rj   r   r   r   r   extendr   
short2longr   r   ro   r>  )rS   r   	subtitlesra   r   Z	sub_langsZ	sub_namessub_filenamesZwebm_vtt_warnZmp4_ass_warnlangZsub_infoZsub_extZinput_filesr   r   r   Z	lang_codetemp_filenamefiles_to_deleter)   r)   r9   r   I  sj    






zFFmpegEmbedSubtitlePP.run)NF)	rI   rJ   rK   r)  rP   r   r+  r   r;  r)   r)   r/  r9   r=  B  s   
r=  c                   @   sR   e Zd ZdddZedd Zejddd	d
 Zedd Z	dd Z
dd ZdS )FFmpegMetadataPPT	if_existsc                 C   s"   t | | || _|| _|| _d S rO   )rL   rP   _add_metadata_add_chapters_add_infojson)rS   rT   Zadd_metadataZadd_chaptersZadd_infojsonr)   r)   r9   rP     s    zFFmpegMetadataPP.__init__c                 c   s,   | dk}t | E d H  |r(dE d H  d S )Nr!   )r  r/   r   r1  )r3  Z
audio_onlyr)   r)   r9   r4    s    zFFmpegMetadataPP._optionsFr  c              	   C   sD  |  | |d d  }}g g  }}| jr\|dr\t|d}|| |d | || | jrr|| | | j	r|d dv r|d}|| 
|| |s||d n| j	du r| d |s| d	 g |fS t|d
}| d| d | ||f|tj| |d g|R   | j|  t|| g |fS )Nr   r   metar   )r#   r"   infojson_filenameTz3The info-json can only be attached to mkv/mka fileszThere isn't any metadata to addr  zAdding metadata to "rD  )r   rP  rh   r   rF  _get_chapter_optsr   rO  _get_metadata_optsrQ  _get_infojson_optsr   r   r   r   r   r4  r   rc   ro   )rS   r   ra   metadata_filenamerL  optionsrS  rK  r)   r)   r9   r     s:    









zFFmpegMetadataPP.runc                 c   s   t |ddd}dd }d}| D ]V}|d7 }|d|d	 d
  7 }|d|d d
  7 }|d}|r |d|| d7 }q || W d    n1 s0    Y  dV  d S )Nr   r   r   c                 S   s   t dd| S )Nz([\\=;#\n])z\\\1)r4   sub)r   r)   r)   r9   ffmpeg_escape  s    z9FFmpegMetadataPP._get_chapter_opts.<locals>.ffmpeg_escapez;FFMETADATA1
z[CHAPTER]
TIMEBASE=1/1000
z	START=%d

start_timei  zEND=%d
r   r7  rC  r   )z-map_metadata1)r   rh   write)r   rW  r   rZ  Zmetadata_file_contentchapterZchapter_titler)   r)   r9   rT    s    
(z"FFmpegMetadataPP._get_chapter_optsc                 #   sB  dt td6 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 |dd |dd d | d!g v r|d"d	 d# d$d  t d%}  D ]F\}}t||}|d ur|r|	d&d'|
d(p.d# |
d)< qd*V  d#  D ]\}}d+| d,| fV  qNd-} d.p gD ]}	d/|	d0|	d1fvrd2nd3}
t|	d4pd'p|	d4}t|||
 D ]V}|rt| d4| t|  D ]$\}}d5| | d,| fV  qq||
7 }qd S )7NrR  c                    sr   t  fdd dgt|p| D d }|dvrndttt|}|dd}d tt| | d S )	Nc                 3   s$   | ]}  |d ur | V  qd S rO   )rh   )r]   key)r   r)   r9   rb     s   zCFFmpegMetadataPP._get_metadata_opts.<locals>.add.<locals>.<genexpr>r   )rs   Nr?   rs   common)	rm   r   r7   mapstrro   updatedictfromkeys)Z	meta_listZ	info_listr   r   Zmeta_prefixmetadatar)   r9   add  s    z0FFmpegMetadataPP._get_metadata_opts.<locals>.addr7  )trackr7  dateZupload_date)descriptionsynopsisrl  )purlcommentZwebpage_urlrj  Ztrack_numberartist)rp  ZartistsZcreatorZcreatorsZuploaderZuploader_idcomposer)rq  Z	composersgenre)rr  ZgenresZalbumalbum_artist)rs  Zalbum_artistsZdiscZdisc_numbershowZseriesZseason_number
episode_id)Zepisoderu  Zepisode_sortZepisode_numberzembed-metadataZcompat_optsro  ra  rm  z(?P<i>\d+)?_(?P<key>.+)r`  rs   r   r_  )z-write_id3v1r\  z	-metadatar   r   requested_formatsnonevcodecr%  r   r   language-metadata:s:)N)collectionsdefaultdictre  rf   popr4   escaperE  	fullmatchro   ry   rh   r   rG  rangerc  
setdefault)rS   r   ri  Z
meta_regexr_  r   r   r   Z
stream_idxfmtZstream_countrJ  r   r)   rg  r9   rU    sN    














("""z#FFmpegMetadataPP._get_metadata_optsc                 c   s   |rt j|s| jdurd S |pJd| j|dpHt| j|d|d  }| j|s\d S | d|  t	| j
|| dd| ||d< | |d	 d
d\}}|d urdd| fV  |d8 }d| |d| dd| dfV  d S )NTz%s.tempZinfojsonz	info.jsonr   zWriting info-json to: Zclean_infojsonrS  r   )tagsmimetypezapplication/jsonr   z-0:r   z-attachrz  zmimetype=application/jsonzfilename=info.json)rc   rd   ri   rQ  _downloaderprepare_filenamer   _ensure_dir_existsr   r   Zsanitize_inforf   r   r   )rS   r   ZinfofnZ
old_streamZ
new_streamr)   r)   r9   rV    s(    



z#FFmpegMetadataPP._get_infojson_optsN)TTrN  )rI   rJ   rK   rP   r  r4  r   r+  r   rT  rU  rV  r)   r)   r)   r9   rM    s   



!
<rM  c                   @   s.   e Zd ZejZejdddd Zdd Z	dS )FFmpegMergerPPFr  c           	      C   s   |d }t |d}ddg}d}t|d D ]\}}|ddkr|d	| d
g |d dor| |d dk}|r|d| dg |d7 }|ddkr*|d	| dg q*| d| d | |d || t	|| |d |fS )Nr   r  r   r   r   rv  r%  rw  r   z:a:0protocolm3u8r    z-bsf:a:r,   r   rx  z:v:0zMerging formats into "rD  Z__files_to_merge)
r   r   rh   rF  r   r   r   r   rc   rename)	rS   r   ra   rK  r   Zaudio_streamsr   r  Z	aac_fixupr)   r)   r9   r   -  s"    
 zFFmpegMergerPP.runc                 C   s   dS )NTr)   r   r)   r)   r9   	can_mergeA  s    zFFmpegMergerPP.can_mergeN)
rI   rJ   rK   r   r:  r)  r   r+  r   r  r)   r)   r)   r9   r  *  s   

r  c                   @   s   e Zd Zdd ZdS )FFmpegFixupPostProcessorc                 C   s>   t |d}| | d| d | ||| t|| d S )Nr  z of "rD  )r   r   r   rc   ro   )rS   r   ra   rX  rK  r)   r)   r9   _fixupG  s    
zFFmpegFixupPostProcessor._fixupN)rI   rJ   rK   r  r)   r)   r)   r9   r  F  s   r  c                   @   s"   e Zd Zejddddd ZdS )FFmpegFixupStretchedPPF)r  audioc                 C   s@   | d}|dvr8| d|d g |  d|d g |fS )Nstretched_ratior   zFixing aspect ratior   z-aspectr   rh   r  r   )rS   r   r  r)   r)   r9   r   Q  s    
zFFmpegFixupStretchedPP.runNrI   rJ   rK   r   r+  r   r)   r)   r)   r9   r  P  s   r  c                   @   s"   e Zd Zejddddd ZdS )FFmpegFixupM4aPPF)r  videoc                 C   s8   | ddkr0| d|d g |  dd g |fS )N	containerZm4a_dashzCorrecting containerr   r*   r   r  rS   r   r)   r)   r9   r   [  s    "zFFmpegFixupM4aPP.runNr  r)   r)   r)   r9   r  Z  s   r  c                   @   s(   e Zd Zdd Zejdddd ZdS )FFmpegFixupM3u8PPc              
   c   s   |d dv V  |d  dV  z| |d }W n< tyl } z$| d|j  dV  W Y d }~nd }~0 0 t|dd	d
dkV  d S )Nr   )r   r!   r  r  r   zUnable to extract metadata: T)r6   format_nameFr   r   )r   r   r	   rj   r   r   )rS   r   rh  r   r)   r)   r9   _needs_fixupc  s    zFFmpegFixupM3u8PP._needs_fixupFr  c                 C   s\   t | |rTddg}| |d dkr6|ddg | d|d g |  | g |fS )Nr*   r   r   r    r+   r,   zFixing MPEG-TS in MP4 container)allr  r   rF  r  r   )rS   r   r   r)   r)   r9   r   n  s    zFFmpegFixupM3u8PP.runN)rI   rJ   rK   r  r   r+  r   r)   r)   r)   r9   r  b  s   
r  c                       s2   e Zd Zd	 fdd	Zejdddd Z  ZS )
FFmpegFixupTimestampPPNMbP?c                    s,   t  | t|ttfsJ t|| _d S rO   )r.  rP   
isinstancer  floatrc  trim)rS   rT   r  r/  r)   r9   rP   {  s    zFFmpegFixupTimestampPP.__init__Fr  c                 C   sZ   | j ds | d ddg}ng d}| d|d g || dd	| j g |fS )
Nrt   zA re-encode is needed to fix timestamps in older versions of ffmpeg. Please install ffmpeg 4.4 or later to fixup without re-encodingz-vfzsetpts=PTS-STARTPTS)r   r   z-bsfzsetts=ts=TS-STARTPTSzFixing frame timestampr   F-ss)rV   rh   rj   r  r   r  )rS   r   r   r)   r)   r9   r     s    
*zFFmpegFixupTimestampPP.run)Nr  )rI   rJ   rK   rP   r   r+  r   r;  r)   r)   r/  r9   r  y  s   
r  c                   @   s$   e Zd ZdZejdddd ZdS )FFmpegCopyStreamPPzCopying streamFr  c                 C   s    |  | j|d |   g |fS )Nr   )r  MESSAGEr   r  r)   r)   r9   r     s    zFFmpegCopyStreamPP.runN)rI   rJ   rK   r  r   r+  r   r)   r)   r)   r9   r    s   
r  c                   @   s   e Zd ZdZdS )FFmpegFixupDurationPPzFixing video durationNrI   rJ   rK   r  r)   r)   r)   r9   r    s   r  c                   @   s   e Zd ZdZdS )FFmpegFixupDuplicateMoovPPzFixing duplicate MOOV atomsNr  r)   r)   r)   r9   r    s   r  c                       s,   e Zd ZejZd fdd	Zdd Z  ZS )FFmpegSubtitlesConvertorPPNc                    s   t  | || _d S rO   )r.  rP   r6   rS   rT   r6   r/  r)   r9   rP     s    z#FFmpegSubtitlesConvertorPP.__init__c              	   C   s  | d}| j}|}|dkr d}|d u r:| d g |fS | d g }| D ]\}}tj| dds| d| d	 qP|d
 }||kr| d| d qPn|dkr| d qP|d }	||	 t	|	|}
|dv r| d |	}t	|	d}t
|d}t| }W d    n1 s(0    Y  t
|ddd}|| W d    n1 sb0    Y  |}	d||d||< |dkrqPn
|| | |	|
d|g t
|
dd$}|| |
d||< W d    n1 s0    Y  t	|d |d  ||d |
< qP||fS )Nr@  r&   r   z%There aren't any subtitles to convertzConverting subtitlesr   rs   rA  rB  r   zSubtitle file for z# is already in the requested formatr   zaYou have requested to convert json subtitles into another format, which is currently not possible)ZdfxpZttmlttzpYou have requested to convert dfxp (TTML) subtitles into another format, which results in style information lossZsrtrbr   r   r   )r   datar   r*   __files_to_move)rh   r6   r   rE  rc   rd   ri   rj   r   r   r   r   readr]  r   )rS   r   subsZnew_extZ
new_formatrI  rJ  rY  r   Zold_fileZnew_fileZ	dfxp_fileZsrt_filer   Zsrt_datar)   r)   r9   r     sl    






,*


*zFFmpegSubtitlesConvertorPP.run)NN)	rI   rJ   rK   r   rH  r)  rP   r   r;  r)   r)   r/  r9   r    s   r  c                   @   s:   e Zd ZdddZdd Zdd Zejddd	d
 ZdS )FFmpegSplitChaptersPPFc                 C   s   t | | || _d S rO   )rL   rP   _force_keyframes)rS   rT   r   r)   r)   r9   rP     s    zFFmpegSplitChaptersPP.__init__c                 C   s<   |  }|||d|d|dd | j|dS )Nr7  r[  r   )Zsection_numberZsection_titleZsection_startZsection_endr^  )r   rd  rh   r  r  )rS   r   r^  r   r)   r)   r9   _prepare_filename  s    z'FFmpegSplitChaptersPP._prepare_filenamec                 C   s`   |  |||}| j|sd S ||d< | d||f  |dt|d dt|d |d  gfS )Nr   zChapter %03d; Destination: %sr  r[  z-tr   )r  r  r  r   rc  )rS   r   r^  r   destinationr)   r)   r9   _ffmpeg_args_for_chapter  s    z.FFmpegSplitChaptersPP._ffmpeg_args_for_chapterr  c                 C   s   |  | |dpg }|s.| d g |fS |d }| jr^t|dkr^| |dd |D }| dt| d t|D ]:\}}| |d ||\}}| ||fg|| 	 fg q|||d kr| j
|d d	 g |fS )
Nr   z"Chapter information is unavailabler   r   c                 s   s   | ]}|d  V  qdS )r[  Nr)   )r]   cr)   r)   r9   rb     r`   z,FFmpegSplitChaptersPP.run.<locals>.<genexpr>zSplitting video by chapters; z chapters found)r   )r   rh   r   r  r@   r   r   r  r   r   r   )rS   r   r   in_fileidxr^  r  r   r)   r)   r9   r     s    

zFFmpegSplitChaptersPP.runN)F)	rI   rJ   rK   rP   r  r  r   r+  r   r)   r)   r)   r9   r    s
   


r  c                       s^   e Zd ZejZeeZd fdd	Ze	dd Z
dddZed	d
 Zdd Zdd Z  ZS )FFmpegThumbnailsConvertorPPNc                    s   t  | || _d S rO   r-  r  r/  r)   r9   rP     s    z$FFmpegThumbnailsConvertorPP.__init__c                 C   s&   t | j d| j d t|dkS )N.z.is_webp is deprecatedwebp)r   rJ   rI   r   what)r  rd   r)   r)   r9   is_webp"  s    z#FFmpegThumbnailsConvertorPP.is_webpr=   c                 C   s   |d | d }t j|\}}|r| dkrt|dkr| d| d t|d}t || ||d | d< t|d 	|d|d |< d S )N
thumbnailsr   z.webpr  zCorrecting thumbnail "z" extension to webpr  )
rc   rd   splitextr>   r   r  r   r   ro   r}  )rS   r   r  thumbnail_filenamer   thumbnail_extZwebp_filenamer)   r)   r9   
fixup_webp'  s    
z&FFmpegThumbnailsConvertorPP.fixup_webpc                 c   s    dE d H  | dkrdE d H  d S )N)z-updater\  jpg)z-bsf:vZ
mjpeg2jpegr)   r2  r)   r)   r9   r4  3  s    
z$FFmpegThumbnailsConvertorPP._optionsc                 C   sb   t ||}| d| d|  tj|\}}| ||dkrBg ng dfg|| |fg |S )NzConverting thumbnail "z" to z.gif)r*   Zimage2z-pattern_typerw  )r   r   rc   rd   r  r   r4  )rS   r  r3  Zthumbnail_conv_filenamer   r8  r)   r)   r9   convert_thumbnail9  s    
z-FFmpegThumbnailsConvertorPP.convert_thumbnailc           
      C   s   g }d}t |dpg D ]\}}|d}|s2qd}| || |d }tj|d dd   }|dkrrd}t|| j\}}	|	r| 	d| d	|	  q| 
|||d< || t|d
 | ||d
 |d < q|s| 	d ||fS )NFr  r   Tr   Zjpegr  zNot converting thumbnail "r5  r  z&There aren't any thumbnails to convert)r   rh   r  rc   rd   r  r>   rG   rC   r   r  r   r   )
rS   r   rL  Zhas_thumbnailr  Zthumbnail_dictZoriginal_thumbnailr  r3  r#  r)   r)   r9   r   C  s0    


zFFmpegThumbnailsConvertorPP.run)NN)r=   )rI   rJ   rK   r   r  r)  r:   r*  rP   r  r  r  r  r4  r  r   r;  r)   r)   r/  r9   r    s   



r  c                       sH   e Zd Zd fdd	Zdd Z fddZejdddd	d
 Z  Z	S )FFmpegConcatPPFc                    s   || _ t | d S rO   )_only_multi_videor.  rP   )rS   rT   Zonly_multi_videor/  r)   r9   rP   `  s    zFFmpegConcatPP.__init__c                 C   s.   t | |d}| dd|  t|S )N)r   .Z
codec_namez	Codecs = r?  )r   r   r   r7   r(  )rS   r   codecsr)   r)   r9   _get_codecsd  s    zFFmpegConcatPP._get_codecsc                    s   | j |sd S t|dkrhtj|d tj|krT| d|d  d| d t|d | g S ttt	| j
|dkrtd| dt| d|  t || |S )	Nr   r   zMoving "z" to "rD  zThe files have different streams/codecs and cannot be concatenated. Either select different formats or --recode-video them to a common formatzConcatenating z files; Destination: )r  r  r@   rc   rd   realpathr   ro   setrb  r  r	   r.  r   )rS   r   r   r/  r)   r9   r   i  s    zFFmpegConcatPP.concat_files)r  Z	simulatedc                 C   s   | dpg }t|r(| jr0|d dkr0g |fS t|ddd frJtdt|dpVg }t|t|k rptd	t|d
d}tdtt|dkr|d ndi|| j	
|}| j	|d}| ||}||d dg|d< ||fS )Nentries_typeZmulti_video.c                 S   s   | dkot |dkS )Nrequested_downloadsr   )r@   )r  vr)   r)   r9   r     r`   z$FFmpegConcatPP.run.<locals>.<lambda>zIConcatenation is not supported when downloading multiple separate formats).r  r   r   z4Aborting concatenation because some downloads failed).r  r   r   ).r   r   r   r   r#   Zpl_video)r   r   r  )rh   anyr  r   r	   r@   r{  ChainMapr  r  Z_playlist_infodictr  r   )rS   r   r  r   extsZie_copyr   rL  r)   r)   r9   r   {  s$    "zFFmpegConcatPP.run)F)
rI   rJ   rK   rP   r  r   r   r+  r   r;  r)   r)   r/  r9   r  _  s
   r  ):r{  r  r  r   r   rc   r4   r   r   ra  r   compatr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZEXT_TO_OUT_FORMATSr  r:   rG   rH   rL   r	  r,  r<  r=  rM  r  r  r  r  r  r  r  r  r  r  r  r  r  r)   r)   r)   r9   <module>   st   X  Yj#Q 

	L/E