
    Şi{                     .   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 Z$d Z% G d de          Z& G d d e
          Z' G d! d"e'          Z( G d# d$e'          Z) G d% d&e)          Z* G d' d(e'          Z+ G d) d*e'          Z, G d+ d,e'          Z- G d- d.e'          Z. G d/ d0e.          Z/ G d1 d2e.          Z0 G d3 d4e.          Z1 G d5 d6e.          Z2 G d7 d8e.          Z3 G d9 d:e3          Z4 G d; d<e3          Z5 G d= d>e'          Z6 G d? d@e'          Z7 G dA dBe'          Z8 G dC dDe'          Z9dS )E    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flacipodmatroskampegoggmpegtsasfwebmwebvtt)aacr   m4amkamkvmpgogvtswmawmvwebavtt)mp3
libmp3lame )r&   r%   )-fr   )r&   r%   )-bsf:aaac_adtstoasc)opuslibopusr2   )r    	libvorbisr2   )r   r   r2   )r&   N)-acodecalac)wavN)r3   r;   )r0   r%   r&   r6   vorbisr   r:   r;   c           	          t          j        d                    d                    d                    |                                         S )Nz{0}(?:/{0})*$z(?:\s*\w+\s*>)?\s*(?:{})\s*|)recompileformatjoin)	supporteds    `C:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/postprocessor/ffmpeg.pycreate_mapping_rerE   ?   s@    :&--.L.S.STWT\T\]fTgTg.h.hiijjj    c                 P   |                                                     d          D ]x}|                    dd          }t          |          dk    s|d                                         | k    r/|d                                         }|| k    r	|d|  fc S |dfc S yd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targets        rD   resolve_mappingrT   C   s    
 %%c**    ZZQr77a<<2a5;;==F22V\\^^FFfFFFFFF4<	 3
 99999rF   c                       e Zd ZdS )FFmpegPostProcessorErrorN)__name__
__module____qualname__r2   rF   rD   rV   rV   R   s        DrF   rV   c                   2   e Zd Z ej        dd          Zd(dZed(d            Zed(d            Z	d Z
ddii cZZd Zed	             Zej        d
             Zej        d             Zd Zej        d             Zej        d             Zed             Zed             Zed             Zed             Zed)ddd            Zd Zd Zg fdZd Zd Z d)dZ!d*dZ"d Z#dd d!Z$d" Z%ed#             Z&ed$             Z'd% Z(d(d&Z)e*d(d'            Z+dS )+FFmpegPostProcessorffmpeg_locationN)defaultc                 b    t          j        | |           |                                 | _        d S N)r   __init___determine_executables_paths)self
downloaders     rD   r`   zFFmpegPostProcessor.__init__Y   s,    tZ0001133rF   c                 <    t          |           }|j        |j        fS r_   )r[   	_versions	_features)rd   pps     rD   get_versions_and_featuresz-FFmpegPostProcessor.get_versions_and_features]   s     ,,|R\))rF   c                 B    t                               |           d         S )Nr   )r[   ri   )rd   s    rD   get_versionsz FFmpegPostProcessor.get_versionsb   s    "<<ZHHKKrF   c                 ,   ddg}|                      d| j                                                  }|d |D             S t          j                            |          s|                     d| dd           i S t          j                            |          r|d d c}nwt          j                            |          t          fd	|D             d          }t          j        
                    t          j                            |                    fd
|D             }|ra|v r]|D ]Z}t          j                                                ||                    }t          j                            |          r|||<   [|r|||<   |S )Nffmpegffprober\   c                     i | ]}||S r2   r2   ).0ps     rD   
<dictcomp>z>FFmpegPostProcessor._determine_executables.<locals>.<dictcomp>k   s    +++QAq+++rF   zffmpeg-location z* does not exist! Continuing without ffmpegT)	only_oncec              3   $   K   | ]
}|v |V  d S r_   r2   )rp   rq   filenames     rD   	<genexpr>z=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>u   s'      BB1AMMQMMMMBBrF   c                 R    i | ]#}|t           j                            |          $S r2   )ospathrB   )rp   rq   dirnames     rD   rr   z>FFmpegPostProcessor._determine_executables.<locals>.<dictcomp>x   s+    ???BGLL!,,???rF   )	get_param_ffmpeg_locationgetrx   ry   existsreport_warningisdirbasenamenextrz   abspathrB   replace)	rc   programslocationr   pathsrq   ry   rz   ru   s	          @@rD   ra   z*FFmpegPostProcessor._determine_executablesf   s   i(>>"3T5J5N5N5P5PQQ++(++++w~~h'' 		AW8WWWcg   i i iIW]]8$$ 	A*2D$'GXxxw''11HBBBBBBBHMMHgoobgooh&?&?@@G????h??? 	$H,, $ $w||GX-=-=h-J-JKK7>>$'' $#E!H 	'&E(OrF   c                 p   | j                             |          }|| j        v r(| j        |         | j                            |i           fS t	          |dg          }|rt          |          nd}|r5ddg}|D ].}t          j        ||          }|r|                    d          }/|| j        |<   |dk    s|s|i fS t          j	        d|          }|r)|                    d          
                    d	d
          nd }d|v d|                                v t          |dd          dx| j        |<   }	||	fS )Nz-bsfsFz'(?:\d+:)?([0-9.]+)-[0-9]+ubuntu[0-9.]+$zn([0-9.]+)$r   rm   z>(?m)^\s+libavformat\s+(?:[0-9. ]+)\s+/\s+(?P<runtime>[0-9. ]+)runtime  z--enable-libfdk-aacsettsz	57.56.100)fdkr   needs_adtstoasc)rb   r}   _version_cache_features_cacher   r   r?   matchgroupsearchr   
splitlinesr   )
rc   progry   outverregexsregexmobjlavf_runtime_versionfeaturess
             rD   _get_ffmpeg_versionz'FFmpegPostProcessor._get_ffmpeg_version   sy   {t$$4&&&&t,d.B.F.FtR.P.PPP%dWI66),7 %%%% 		(:F
   ( (xs++ (**Q--C$'D!837NyZ\_``IMWtzz)44<<S"EEESW(C/ 0 0023GV[\\1
 1
 	
T"X
 H}rF   c                 P    t          | j        | j        | j        | j        i          S r_   )r   r   _versionprobe_basename_probe_versionrc   s    rD   rf   zFFmpegPostProcessor._versions   s#    DM4=$:MtObcdddrF   c                     | j         }| j        S r_   )r   r   rc   _s     rD   r   zFFmpegPostProcessor.basename   s    M}rF   c                     | j         }| j        S r_   )r   r   r   s     rD   r   z"FFmpegPostProcessor.probe_basename   s    ""rF   c                      |f}t          t          d  fd|D                       d d i f          \  }}}|dk    r||c _         _        n| _        |S )Nc                     | d         S Nr   r2   )xs    rD   <lambda>z2FFmpegPostProcessor._get_version.<locals>.<lambda>   s
    ad rF   c              3   J   K   | ]}|g                     |          R V  d S r_   )r   )rp   rq   rc   s     rD   rv   z3FFmpegPostProcessor._get_version.<locals>.<genexpr>   s<      TT1a>$":":1"="=>>TTTTTTrF   rm   )r   filterr   rg   r   )rc   kindexecutablesr   versionr   s   `     rD   _get_versionz FFmpegPostProcessor._get_version   s    h&*6NTTTTTTT,V ,VX\^bdfWg'i 'i#'88,4h)DM4>>"*DrF   c                 ,    |                      d          S )Nrm   r   r   s    rD   r   zFFmpegPostProcessor._version   s      ***rF   c                 ,    |                      d          S )Nrn   r   r   s    rD   r   z"FFmpegPostProcessor._probe_version   s      +++rF   c                     | j         d uS r_   )r   r   s    rD   	availablezFFmpegPostProcessor.available   s    
 }D((rF   c                 @    | j                             | j                  S r_   )rb   r}   r   r   s    rD   
executablezFFmpegPostProcessor.executable   s    {t}---rF   c                     | j         d uS r_   )r   r   s    rD   probe_availablez#FFmpegPostProcessor.probe_available   s    "$..rF   c                 @    | j                             | j                  S r_   )rb   r}   r   r   s    rD   probe_executablez$FFmpegPostProcessor.probe_executable   s    {t2333rF   Textc             #   Z   K   dE d {V  dE d {V  | rdE d {V  |dv r
dE d {V  d S d S )N)-map0)z-dnz-ignore_unknown)-ccopy)mp4movr&   )z-c:smov_textr2   )r   r   s     rD   stream_copy_optsz$FFmpegPostProcessor.stream_copy_opts   s               .------- 	&%%%%%%%%'''++++++++++ ('rF   c           	          | j         st          d          d}t          | j        |          r+|                     d| j         d| j         d| d           d S 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   rV   r   r   r   r   )rc   required_versions     rD   check_versionz!FFmpegPostProcessor.check_version   s    ~ 	{*+yzzz t}.>?? 	g !f !f !fTXTa !f !f.>!f !f !f g g g g g	g 	grF   c                    | j         s| j        st          d          	 | j         r| j        t	          d          g}n| j        t	          d          g}|                    |                     |                     |                     | j	         dt          |                      t          j        |dt          j        t          j        t          j                  \  }}}|| j         rdndk    rd S n# t          $ r Y d S w xY w| j         r|n|}| j         r|d }|                    d	          D ]c}|                    d
          r.|                    d          d                                         }E|                                dk    r||c S dn,t'          j        d|          }	|	r|	                    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_debugr   r   r	   run
subprocessPIPEOSErrorrL   
startswithrN   r?   r   r   )
rc   ry   cmdr   r   
returncodeoutputaudio_codecliner   s
             rD   get_audio_codecz#FFmpegPostProcessor.get_audio_codec   s   # 	BDN 	B%  'A  B  B  B	# *)"?335
 O"4((* JJt55d;;<<<PPk#>N>NPPQQQ).$jojoV`Ve*g *g *g&FFJ4#7>aaQ??t @ 	 	 	44	/;V 	%KT** ' '??=11 '"&**S//!"4":":"<"<KKZZ\\%777K<S&&&&	' 9a D  %zz!}}$ts   CC4 4
DDc                 t   | j         dk    r+| j        r|                     d           t          d          |                                  | j        t          d          t          d          t          d          t          d          t          d          g}||z  }|                    |                     |                     | 	                    d	t          |                      t          j        |d
t          j        t          j        t          j                  \  }}}t          j        |          S )Nrn   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   r   r
   r   r   r   r   r   r   r   r	   r   r   r   r   loads)rc   ry   optsr   r   r   s         rD   get_metadata_objectz'FFmpegPostProcessor.get_metadata_object  s"   )++# Y##$WXXX%&uvvv !>**>**?++?++6""
 	t

411$77888D+c2B2BDDEEEy4
PZP_gqgvwww1z&!!!rF   c                     |                      |          d         }t          fdt          |          D             d           }|t          |          fS )Nstreamsc              3   N   K   | ]\  }}t          |d           k    |V   dS )F	casesenseN)r   )rp   istreamkeysvalues      rD   rv   z8FFmpegPostProcessor.get_stream_number.<locals>.<genexpr>&  sB      kk91fl64[`6a6a6aej6j6jQ6j6j6j6jkkrF   )r   r   	enumeraterM   )rc   ry   r   r   r   nums     ``  rD   get_stream_numberz%FFmpegPostProcessor.get_stream_number#  sc    **400;kkkkk	' 2 2kkk  CLL  rF   c                     t          |d          }|r5|                    d          s"|                     |d                   |d<   d S d S d S )N)chaptersrJ   end_timefilepath)r   r}   _get_real_video_duration)rc   infolast_chapters      rD   _fixup_chaptersz#FFmpegPostProcessor._fixup_chapters*  sl    #D*:;; 	W 0 0 < < 	W'+'D'DT*EU'V'VL$$$	W 	W 	W 	WrF   c                     	 t          t          |                     |          d                    }|st          d          |S # t          $ r$}|rt          d|j                   Y d }~d S d }~ww xY w)N)rA   durationzffprobe returned empty durationz$Unable to determine video duration: )r   r   r   r
   msg)rc   r   fatalr   es        rD   r   z,FFmpegPostProcessor._get_real_video_duration/  s    	Z$T55h??AWXXZ ZH M)*KLLLO" 	Z 	Z 	Z Z)*XQRQV*X*XYYYZ Z Z Z Z Z	Zs   AA 
A3A..A3r   c                 :    |r|sd S t          ||z
            |k    S r_   )abs)rc   d1d2	tolerances       rD   _duration_mismatchz&FFmpegPostProcessor._duration_mismatch:  s-     	 	4 27||i''rF   c                 :     | j         d |D             ||fgfi |S )Nc                     g | ]}|g fS r2   r2   )rp   ry   s     rD   
<listcomp>zAFFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<listcomp>C  s    000DdBZ000rF   )real_run_ffmpeg)rc   input_pathsout_pathr   kwargss        rD   run_ffmpeg_multiple_filesz-FFmpegPostProcessor.run_ffmpeg_multiple_filesA  sB    #t#00K000* *"(* * 	*rF   )r   )expected_retcodesc                H                                       t          d |D                       } j        t          d          g} j        dk    r!|t          d          t          d          gz  } fdd|fd|ffD ]A\  }|t
          j                            fd	t          |          D                       z  }B 	                    d
t          |                      t          j        |dt          j        t          j        t          j                  \  }}}	|	t          |          vrN 	                    |           t!          |                                                                d                   |D ]\  }
}|
r                     |
||           |S )Nc              3   R   K   | ]"\  }}|t          j        |          j        V  #d S r_   )rx   statst_mtime)rp   ry   r   s      rD   rv   z6FFmpegPostProcessor.real_run_ffmpeg.<locals>.<genexpr>I  sS       K K'.tQTKGDMM"K K K K K KrF   z-yrm   z	-loglevelzrepeat+infoc                 $   d| | d| g}|dk    r"|ddgz  }|dk    r|                     d           |                    j        |          z  }|dk    r|                     d           d	 |D                                 |           gz   S )
Nr   oz	-movflagsz
+faststartr   r   r   r   c                 ,    g | ]}t          |          S r2   )r   )rp   args     rD   r
  zJFFmpegPostProcessor.real_run_ffmpeg.<locals>.make_args.<locals>.<listcomp>[  s     555$$555rF   )r   _configuration_argsr   r   )fileargsnamenumberr   rc   s        rD   	make_argsz6FFmpegPostProcessor.real_run_ffmpeg.<locals>.make_argsQ  s    &&f&&
D

3Ds{{l33Q;;KKOOOD,,T]DAAADs{{D!!!5555511$7789:rF   r   r  c              3   d   K   | ]*\  }\  }}|
 |t          |          |d z             V  +dS )r   N)list)rp   r   ry   r   arg_typer  s       rD   rv   z6FFmpegPostProcessor.real_run_ffmpeg.<locals>.<genexpr>_  sg       1E 1E#A|dt1E	$T

Ha!e<<1E 1E 1E 1E 1E 1ErF   zffmpeg command line: Tr   rJ   )r   minr   r   r   	itertoolschainfrom_iterabler   r   r   r	   r   r   r   r   rV   rN   r   	try_utime)rc   input_path_optsoutput_path_optsr  oldest_mtimer   	path_optsr   r   r   r  r!  r  s   `          @@rD   r  z#FFmpegPostProcessor.real_run_ffmpegF  s    K K2AK K K K K t 4 45=H$$N;//1N1NOOC	: 	: 	: 	: 	: &)/$:SBR<S#T 	E 	EHi9?00 1E 1E 1E 1E 1E'0';';1E 1E 1E E E ECC 	CS1A1ACCDDD %	d:?:?R\Ra!c !c !c6:X&78888V$$$*6<<>>+D+D+F+Fr+JKKK+ 	E 	EKHa Ex|DDDrF   c                 $     | j         |g||fi |S r_   )r  )rc   ry   r  r   r  s        rD   
run_ffmpegzFFmpegPostProcessor.run_ffmpegn  s#    -t-tfhOOOOOrF   c                 J    |                      d          r| S | dk    rd| z   n| S )N)zhttp://zhttps://-zfile:)r   )fns    rD   r   z-FFmpegPostProcessor._ffmpeg_filename_argumentq  s4     ==011 	I!Syyw||b0rF   c                     |                      dd                               dd          } | d         dk    r
| dd          nd| z   } | d         dk    r
| d d         n| dz   S )N'z'\''z'''r   r   rJ   )r   )strings    rD   _quote_for_ffmpegz%FFmpegPostProcessor._quote_for_ffmpeg{  sn    
 W--55eSAA%ayC//S6\$RjC//vcrc{{Vc\ArF   c                 Z   t          |          }|d         dk    r
|dd          }t          |d          }|                     d| d           |                     ||g |                     dt          |                    dd	                    d
 |D                                  |S )Nr   r   zkeyframes.tempzRe-encoding "z" with appropriate keyframesFr   z-force_key_frames,c              3      K   | ]}|d V  	dS )z.6fNr2   )rp   ts     rD   rv   z6FFmpegPostProcessor.force_keyframes.<locals>.<genexpr>  s&      )I)IQ**)I)I)I)I)I)IrF   )r   r   	to_screenr,  r   r   rB   )rc   ru   
timestampskeyframe_files       rD   force_keyframesz#FFmpegPostProcessor.force_keyframes  s    
++
a=A#ABBJ)(4DEEMxMMMNNN- 2K""5mH.E.E"FF2K2K!$)I)Ij)I)I)I!I!I2K 	L 	L 	L rF   c                    | d}|                      d|            t          |dd          5 }|                    |                     ||                     ddd           n# 1 swxY w Y   t	          |                     t          |                              }|                     |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-nostdinr3   concatz-safer   )	r   open
writelines_concat_specr   r   r   r  _delete_downloaded_files)rc   in_filesout_fileconcat_optsconcat_filef	out_flagss          rD   concat_filesz FFmpegPostProcessor.concat_files  sA    "***@;@@AAA+sW555 	CLL**8[AABBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C ..=3J3J.KKLL	UUUVW	"#	% 	% 	% 	%%k22222s   *A&&A*-A*c              #      K   |i gt          |          z  }dV  t          ||d          D ]L\  }}d|                     |                     |                     dV  dD ]}||v r| d||          dV  Md S )Nzffconcat version 1.0
Tstrictzfile r   )inpointoutpointr   r   )rM   zipr3  r   )clsrF  rH  r  r   	directives         rD   rD  z FFmpegPostProcessor._concat_spec  s      $X.K&&&&hDAAA 	= 	=JD$X#//0M0Md0S0STTXXXXXX> = =	$$&<<i<<<<<<=	= 	=rF   r_   )T)r   ),rW   rX   rY   contextvars
ContextVarr|   r`   staticmethodri   rk   ra   r   r   r   propertyrf   	functoolscached_propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r,  r   r3  r;  rL  classmethodrD  r2   rF   rD   r[   r[   V   s<       -{-.?NNN4 4 4 4 * * * \* L L L \L  8 (,TlB#NO  : e e Xe    # # #   + + + , , , ) ) X) . . X. / / X/ 4 4 X4 ,4 , , , , \,g g g# # #J .0 " " " ",! ! !W W W
	Z 	Z 	Z 	Z( ( ( (* * *
 W[ & & & & &PP P P 1 1 \1 B B \B	 	 	3 3 3 3& 	= 	= 	= [	= 	= 	=rF   r[   c                       e Zd Zg ej        dR Z ee                                          Z	 e
dge	R           Zd
dZd Zd Z ej        d          d	             ZdS )FFmpegExtractAudioPPr,   bestNFc                     t                               | |           |pd| _        t          |          | _        || _        d S )Nr^  )r[   r`   rP   r   _preferredquality_nopostoverwrites)rc   rd   preferredcodecpreferredqualitynopostoverwritess        rD   r`   zFFmpegExtractAudioPP.__init__  sC    $$T:666%/!./?!@!@!1rF   c                    | j         g S | j         dk    rd| j          dgS ddddd                    |          }|sg S |d	         |d
         |d	         z
  | j         dz  z  z   }|dk    rdt          |           gS d| gS )N
   z-b:ak)rf  r   )r   rf  )g?   )r      )r1   r8   r%   
libfdk_aacr   r   rj  z-vbrz-q:a)r`  r}   int)rc   codeclimitsqs       rD   _quality_argsz"FFmpegExtractAudioPP._quality_args  s    !)I#b((t588899 "   
 
 #e** 	  	I1IVAY.43IB3NOOL  s1vvK((1rF   c                     |g }nd|g}dg||}	 t                               | |||           d S # t          $ r}t          d|j                   d }~ww xY w)Nr9   -vnzaudio conversion failed: )r[   r,  rV   r
   r   )rc   ry   r  rl  	more_optsacodec_optsr   errs           rD   r,  zFFmpegExtractAudioPP.run_ffmpeg  s    =KK$e,K00i0	M**4xFFFFF' 	M 	M 	M%&K#'&K&KLLL	Ms   1 
AAAimagesc                    |d         x}}t          |d         | j                  \  }}|dk    r|d         | j        v rd\  }}|s|                     d| d|            g |fS |                     |          }|t          d          |dk    r|d	v rg t          d
         dR \  }}}	}
n{|dk    s||k    r:	 g t          |         dR \  }}}	}
nV# t          $ r t          d         \  }}
}	Y n9w xY wt          |         \  }}
}	|
dk    r| j        	                    d          rdg }	}
t          |	          }	|
dk    r|                     |
          }	t          |||d                   x}}||k    rE|
dk    r|                     d| d|            g |fS t          |d          }t          |d          }| j        r[t          j                            |          r<t          j                            |          r|                     d| d           g |fS |                     d|            |                     |||
|	           t          j        ||           t          j        ||           ||d<   ||d<   |	                    d          0|                     |t+          j                    |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   r0   r   rj  z#; file is already in target format origtempzPost-process file z exists, skippingzDestination: filetimez!Cannot update utime of audio file)errnote)rT   rP   COMMON_AUDIO_EXTSr8  r   r
   ACODECSKeyErrorrg   r}   r   ro  r   r   ra  rx   ry   r~   r,  r   r&  time)rc   information	orig_pathry   target_format	_skip_msg	filecodec	extensionr   rr  acodec	temp_pathnew_paths                rD   r   zFFmpegExtractAudioPP.run  sO   &z22	D#2;u3Et|#T#T yF""{5'9T=S'S'S'[$M9 	#NNK9KK	KKLLL{?"((..	%&_```-?"B"B.Ewu~.Ev.E.E+Iq)VVf$$(B(B>2M793E2Mv2M2M/	1i > > >/6u~,	6999> ,3=+A(Ivy4>#5#5e#<#<$0"	OO	V**622I0y+eBTUUU	Httytterttuuu;&)$77I)$77I" 	#rw~~h'?'? 	#GNN9--	#NNKKKKLLL{?"1x11222i;;;

4###

9h'''"*J&E ??:&&2NN$)++{:'>Hk  m m m {K''s   9C C/.C/)NNNF)rW   rX   rY   r   common_audior|  tupler}  r   SUPPORTED_EXTSrE   	FORMAT_REr`   ro  r,  r   _restrict_tor   r2   rF   rD   r]  r]    s        ?*7???U7<<>>**N!!6";N";";<<I2 2 2 2     ,	M 	M 	M  ]u---:( :( .-:( :( :(rF   r]  c                        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	Zed             Z ej        d	          d
             Z xZS )FFmpegVideoConvertorPPgifr%   r<   
convertingNc                 X    t                                          |           || _        d S r_   superr`   rP   )rc   rd   preferedformat	__class__s      rD   r`   zFFmpegVideoConvertorPP.__init__"  s&    $$$%rF   c              #   j   K   t                               d          E d {V  | dk    r
dE d {V  d S d S )NFavi)z-c:vlibxvidz-vtagXVIDr[   r   
target_exts    rD   _optionszFFmpegVideoConvertorPP._options&  s]      &77>>>>>>>>>;;;;;;;;;; rF   Fru  c           	         |d         |d                                          }}t          || j                  \  }}|r'|                     d| j         d| d|            g |fS t          |||          }|                     | j                                         d| d| d|            |                     |||                     |                     ||d<   |x|d	<   |d<   |g|fS )
Nr   r   zNot z media file ""; z video from z to z; Destination: rA   )	rK   rT   rP   r8  _ACTIONr   titler,  r  )rc   r   ru   
source_extr  r  outpaths          rD   r   zFFmpegVideoConvertorPP.run,  s   #J/e1B1B1D1D* /
DL I I
I 	NNU$,UUXUU)UUVVVt8O#Hj*EE$,,,..ppJppJppgnppqqq'4==+D+DEEE"Z'11Xez4rF   NN)rW   rX   rY   sortedr   common_videor  r  rE   r  r  r`   rW  r  r   r  r   __classcell__r  s   @rD   r  r    s        	7"/777	8	8	A"/AAAA	B	B N "!.11IG& & & & & & < < \<
  ]u---    .-         rF   r  c                   (    e Zd ZdZed             ZdS )FFmpegVideoRemuxerPPremuxingc                 4    t                                           S r_   r  r  s    rD   r  zFFmpegVideoRemuxerPP._options@  s    "33555rF   N)rW   rX   rY   r  rW  r  r2   rF   rD   r  r  =  s2        G6 6 \6 6 6rF   r  c                   X     e Zd ZdZd fd	Z ej        d          d             Z xZS )FFmpegEmbedSubtitlePP)r   r   r&   r#   r(   r'   NFc                 X    t                                          |           || _        d S r_   )r  r`   _already_have_subtitle)rc   rd   already_have_subtitler  s      rD   r`   zFFmpegEmbedSubtitlePP.__init__H  s)    $$$&;###rF   ru  c                    |d         | j         vr5|                     dd                    | j                    d           g |fS |                    d          }|s|                     d           g |fS |d         }	 |d         }g g g }}}d}d}	|                                D ],\  }
}t
          j                            |                    dd	                    s|                     d
|
 d           S|d         }|dk    r|                     d           n|dk    s|dk    r_|dk    rY|	                    |
           |	                    |                    d                     |	                    |d                    n%|s#|dk    r|dk    rd}|                     d           |	s#|dk    r|dk    rd}	|                     d           .|sg |fS |g|}g | 
                    |d                   dd}t          t          ||d                    D ]\  }\  }
}|                    d|dz    dg           t          j        |
          p|
}|                    d| d| g           |r%|                    d| d| d| d| g           t!          |d           }|                     d!| d"           |                     |||           t          j        ||           | j        rg n|}||fS )#Nr   z"Subtitles can only be embedded in , z filesrequested_subtitlesz#There aren't any subtitles to embedr   Fr   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   asszEASS subtitles cannot be properly embedded in mp4 files; expect issuesr   r   z-0:srN  r   z:0z-metadata:s:s:z	language=zhandler_name=title=ry  zEmbedding subtitles in "")r  r8  rB   r}   itemsrx   ry   r~   r   r   r   r   rR  extendr   
short2longr   r  r   r  )rc   r   	subtitlesru   r   	sub_langs	sub_namessub_filenameswebm_vtt_warnmp4_ass_warnlangsub_infosub_extinput_filesr   r   r  	lang_codetemp_filenamefiles_to_deletes                       rD   r   zFFmpegEmbedSubtitlePP.runL  s   ;d111NNf		$J]@^@^fffgggt8OHH233	 	NNABBBt8O
#
	 5k.0"bm9	'oo// 	m 	mND(7>>(,,z2">">?? ##$e$$e$e$efffuoG&  ##$GHHHH3&==W5E5E  &&&  f!5!5666$$Xj%9::::$ _7e;K;K$(M''(]^^^ mC5LLW5E5E###$klll 	t8O0-0
""tE{"33
 	
 	
  )Y	$)O)O)OPP 	E 	EOA|dKKAE.///#.t44<IKK-!--/F9/F/FGHHH E1a113I43I3I1a11?D??D E E E *(F;;=(===>>>&&{M4HHH

=(+++ $ ;N""$$rF   )NF)	rW   rX   rY   r  r`   r   r  r   r  r  s   @rD   r  r  E  su        @N< < < < < <  ]u---F% F% .-F% F% F% F% F%rF   r  c                       e Zd ZddZed             Z ej        d          d             Zed             Z	d	 Z
d
 ZdS )FFmpegMetadataPPT	if_existsc                 f    t                               | |           || _        || _        || _        d S r_   )r[   r`   _add_metadata_add_chapters_add_infojson)rc   rd   add_metadataadd_chaptersadd_infojsons        rD   r`   zFFmpegMetadataPP.__init__  s6    $$T:666)))rF   c              #   p   K   | dk    }t                               |           E d {V  |r
dE d {V  d S d S )Nr&   )rq  r9   r   r  )r  
audio_onlys     rD   r  zFFmpegMetadataPP._options  sh      5(
&77JGGGGGGGGG 	21111111111	2 	2rF   Fru  c           
         |                      |           |d         d }}g g }}| j        ri|                    d          rTt          |d          }|                    |                     |d         |                     |                    |           | j        r(|                    |                     |                     | j	        r|d         dv ri|                    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%          j        ||           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 addry  zAdding metadata to "r  )r   r  r}   r   r  _get_chapter_optsr   r  _get_metadata_optsr  _get_infojson_optsr8  r   r  r#  r$  r  rE  rx   r   )rc   r   ru   metadata_filenamer  optionsr  r  s           rD   r   zFFmpegMetadataPP.run  s*   T"""&*:&6##%r 	6$((:"6"6 	6 1(F C CNN411$z2BDUVVWWW""#4555 	:NN422488999 	VE{n,,$(HH-@$A$A!t66t=NOOPPP( J#**4884G+H+HIII#t++TUUU 	NN=>>>t8O)(F;;9h999:::&&()=ODMM$u+66AAAA	C 	C 	C 	&%77

=(+++4xrF   c              #   D  K   t          |dd          5 }d }d}| D ]R}|dz  }|d|d         d	z  z  z  }|d
|d         d	z  z  z  }|                    d          }|r|d ||           dz  }S|                    |           d d d            n# 1 swxY w Y   dV  d S )Nr=  r>  r?  c                 .    t          j        dd|           S )Nz([\\=;#\n])z\\\1)r?   sub)r   s    rD   ffmpeg_escapez9FFmpegMetadataPP._get_chapter_opts.<locals>.ffmpeg_escape  s    vngt<<<rF   z;FFMETADATA1
z[CHAPTER]
TIMEBASE=1/1000
z	START=%d

start_timei  zEND=%d
r   r  r  r   )z-map_metadata1)rB  r}   write)r   r  rJ  r  metadata_file_contentchapterchapter_titles          rD   r  z"FFmpegMetadataPP._get_chapter_opts  s:     #S7;;; 	+q= = = %5!# W W%)GG%%9NQU9U)VV%%wz7JT7Q)RR% 'G 4 4  W)-VmmM6R6R-V-V-VV)GG)***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ %$$$$$s   A0BBBc              #     K   dt          j        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          j                   d%}                                D ]e\  }}t          j        ||          }|I|rG|	                    d&d'          |
                    d(          pd#         |
                    d)          <   fd*V  d#                                         D ]\  }}d+| d,| fV  d-}                    d.          pgD ]}	d/|	                    d0          |	                    d1          fvrd2nd3}
t          j        |	                    d4          pd'          p|	                    d4          }t          |||
z             D ]h}|r)t          |                                       d4|           t          |                                                   D ]\  }}d5| | d,| fV  i||
z  }d S )7Nr  c                    t          fd dgt          |p|           D             d           }|dvrd                    t          t          t          |                              }|                    dd          }d                             t                              t          |           |                     d S d S )Nc              3   R   K   | ]!}                     |          |         V  "d S r_   )r}   )rp   keyr   s     rD   rv   zCFFmpegMetadataPP._get_metadata_opts.<locals>.add.<locals>.<genexpr>  sC       . .!88C==, S	,,,,. .rF   r   )r   Nr   r   common)	r   r   rB   mapstrr   updatedictfromkeys)	meta_list	info_listr   r   meta_prefixmetadatas      rD   addz0FFmpegMetadataPP._get_metadata_opts.<locals>.add  s     . . . .)4&7&7&7%[(9CYPY:Z:Z%[. . ./35 5E J&&		#c8E??";";<<dB//"))$--8K8KU*S*STTTTT '&rF   r  )trackr  dateupload_date)descriptionsynopsisr  )purlcommentwebpage_urlr  track_numberartist)r  artistscreatorcreatorsuploaderuploader_idcomposer)r  	composersgenre)r
  genres
categoriestagsalbum)r  seriesalbum_artist)r  album_artistsdiscdisc_numbershowr  season_number
episode_id)episoder  episode_sortepisode_numberzembed-metadatacompat_optsr  r  r  z(?P<i>\d+)?_(?P<key>.+)r  r   r   r  )z-write_id3v1r  z	-metadatar   r   requested_formatsnonevcodecr  r   r   language-metadata:s:r_   )collectionsdefaultdictr  r{   popr?   escaper  	fullmatchr   r   r}   r   r  ranger  
setdefault)rc   r   r  
meta_regexr  r   r   r  
stream_idxfmtstream_countr  r   r  r  s    `           @@rD   r  z#FFmpegMetadataPP._get_metadata_opts  s     *400	U 	U 	U 	U 	U 	U 	U 	U 	G'(((FM"""'777///G^$$$H]^^^J1222G>???G()))N=>>>FM"""FHOL3444N,---t~~mR@@@@C	=)))X"":t444;//HHH
**,, 	c 	cJC<
C00D T KP==Y]_aKbKbC4H5djj6G6GH $####H-3355 	3 	3KD%4 1 1% 1 122222
88/00:TF 	' 	'C &swwx/@/@#''(BSBS.T T T11Z[L)#''**=*=*CDD[PZH[H[D:zL'@AA B B BSVV$//
DAAA#+CFF#3#9#9#;#; B BKD%-!--$/@/@/@/@AAAAAB,&JJ	' 	'rF   c           	   #     K   |rt           j                            |          s| j        durd S |pLd| j                            |d          p.t          | j                            |          d|d                   z  }| j                            |          sd S |                     d|            t          | j        
                    ||                     dd                    |           ||d<   |                     |d	         d
d          \  }}|dd| fV  |dz  }d|                     |          d| dd| dfV  d S )NTz%s.tempinfojsonz	info.jsonr   zWriting info-json to: clean_infojsonr  r   )r  mimetypezapplication/jsonr   z-0:r   z-attachr  zmimetype=application/jsonzfilename=info.json)rx   ry   r~   r  _downloaderprepare_filenamer   _ensure_dir_existsr   r   sanitize_infor{   r   r   )rc   r   infofn
old_stream
new_streams        rD   r  z#FFmpegMetadataPP._get_infojson_opts  s      
	/RW^^F33 
	/!-- iy 11$
CC h$T%5%F%Ft%L%Lk[_`e[fgg iF #66v>> >f>>???D,::4P`bfAgAghhjpqqq(.D$%!%!7!7Z8HJ^`r!s!s
J!---....!OJ t55f==':'')D':'')=
 	
 	
 	
 	
 	
rF   N)TTr  )rW   rX   rY   r`   rW  r  r   r  r   r  r  r  r2   rF   rD   r  r    s        * * * * 2 2 \2  ]u---  .-B % % \% :' :' :'x
 
 
 
 
rF   r  c                   V    e Zd Zej        Z ej        d          d             Zd Z	dS )FFmpegMergerPPFru  c                    |d         }t          |d          }ddg}d}t          |d                   D ]\  }}|                    d          dk    ru|                    d	| d
g           |d                             d          o|                     |d                   dk    }|r|                    d| dg           |dz  }|                    d          dk    r|                    d	| dg           |                     d| d           |                     |d         ||           t          j	        ||           |d         |fS )Nr   ry  r   r   r   r  r  r  r   z:a:0protocolm3u8r%   z-bsf:a:r5   r   r  z:v:0zMerging formats into "r  __files_to_merge)
r   r   r}   r  r   r   r8  r  rx   rename)	rc   r   ru   r  r  audio_streamsr   r)  	aac_fixups	            rD   r   zFFmpegMergerPP.run0  s}   
#)(F;;f~!$':";<< 	2 	2HQwwx  F**VZZZ0111
O66v>>q4CWCWX[\fXgChChlqCq	 NKK!:=!:!:O LMMM"wwx  F**VZZZ0111;;;;<<<&&t,>'?PTUUU
	-***&'--rF   c                     dS )NTr2   r   s    rD   	can_mergezFFmpegMergerPP.can_mergeD  s    trF   N)
rW   rX   rY   r   r  r  r   r  r   r@  r2   rF   rD   r7  r7  -  sU        %2N]u---. . .-.&    rF   r7  c                       e Zd Zd ZdS )FFmpegFixupPostProcessorc                     t          |d          }|                     | d| d           |                     |||           t          j        ||           d S )Nry  z of "r  )r   r8  r,  rx   r   )rc   r   ru   r  r  s        rD   _fixupzFFmpegFixupPostProcessor._fixupJ  sb    )(F;;#//H///000-999

=(+++++rF   N)rW   rX   rY   rD  r2   rF   rD   rB  rB  I  s#        , , , , ,rF   rB  c                   D    e Zd Z ej        dd          d             ZdS )FFmpegFixupStretchedPPF)rv  audioc                     |                     d          }|dvr7|                     d|d         g |                                 d|d           g |fS )Nstretched_ratior   zFixing aspect ratior   z-aspectrJ  r}   rD  r   )rc   r   rI  s      rD   r   zFFmpegFixupStretchedPP.runT  s    ((#455)++KK-tJ/? BM&&((BM*3BM8G5K5KBM N N N4xrF   NrW   rX   rY   r   r  r   r2   rF   rD   rF  rF  S  s@        ]uE:::  ;:  rF   rF  c                   D    e Zd Z ej        dd          d             ZdS )FFmpegFixupM4aPPF)rv  videoc                     |                     d          dk    r5|                     d|d         g |                                 dd           g |fS )N	containerm4a_dashzCorrecting containerr   r3   r   rJ  rc   r   s     rD   r   zFFmpegFixupM4aPP.run^  s\    88K  J..KK.Z0@BiDDYDYD[D[Bi]aBichBijjj4xrF   NrK  r2   rF   rD   rM  rM  ]  s@        ]uE:::  ;:  rF   rM  c                   H    e Zd Zd Z ej        d          d             ZdS )FFmpegFixupM3u8PPc              #   6  K   |d         dv V  |d                              d          V  	 |                     |d                   }t          |dd          d	k    V  d S # t          $ r,}|                     d
|j                    dV  Y d }~d S d }~ww xY w)Nr   )r   r&   r9  r:  r   )rA   format_nameFr   r!   zUnable to extract metadata: T)r   r   r   r
   r   r   )rc   r   r  r  s       rD   _needs_fixupzFFmpegFixupM3u8PP._needs_fixupf  s      5k^++++:))&11111	a//Z0@AAH
 x)BeTTTX```````	 # 	 	 	 Fqu F FGGGJJJJJJJJJ	s   A" "
B,!BBFru  c                 (   t          |                     |                    rmddg}|                     |d                   dk    r|                    ddg           |                     d|d         g |                                 |           g |fS )Nr3   r   r   r%   r4   r5   zFixing MPEG-TS in MP4 container)allrW  r   r  rD  r   )rc   r   r  s      rD   r   zFFmpegFixupM3u8PP.runq  s    t  &&'' 	2%=D##D$455>>X7888KK94
;K N1&&((N1+/N1 2 2 24xrF   N)rW   rX   rY   rW  r   r  r   r2   rF   rD   rT  rT  e  sR        	a 	a 	a  ]u---  .-  rF   rT  c                   T     e Zd Zd fd	Z ej        d          d             Z xZS )FFmpegFixupTimestampPPNMbP?c                     t                                          |           t          |t          t          f          sJ t          |          | _        d S r_   )r  r`   
isinstancerk  floatr  trim)rc   rd   r`  r  s      rD   r`   zFFmpegFixupTimestampPP.__init__~  sF    $$$$e-----II			rF   Fru  c                     | j                             d          s|                     d           ddg}ng d}|                     d|d         g ||                     d          d	| j                   g |fS )
Nr   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)rg   r}   r   rD  r   r`  )rc   r   r   s      rD   r   zFFmpegFixupTimestampPP.run  s    ~!!'** 	BRS S S 01DDAAAD,d:.>@x$@xI^I^_dIeIe@xgl@xnrnw@xyyy4xrF   )Nr\  )rW   rX   rY   r`   r   r  r   r  r  s   @rD   r[  r[  |  si               ]u---	 	 .-	 	 	 	 	rF   r[  c                   F    e Zd ZdZ ej        d          d             ZdS )FFmpegCopyStreamPPzCopying streamFru  c                 r    |                      | j        |d         |                                            g |fS )Nr   )rD  MESSAGEr   rR  s     rD   r   zFFmpegCopyStreamPP.run  s4    DL$z"2D4I4I4K4KLLL4xrF   N)rW   rX   rY   rf  r   r  r   r2   rF   rD   rd  rd    sC        G]u---  .-  rF   rd  c                       e Zd ZdZdS )FFmpegFixupDurationPPzFixing video durationNrW   rX   rY   rf  r2   rF   rD   rh  rh    s        %GGGrF   rh  c                       e Zd ZdZdS )FFmpegFixupDuplicateMoovPPzFixing duplicate MOOV atomsNri  r2   rF   rD   rk  rk    s        +GGGrF   rk  c                   4     e Zd Zej        Zd fd	Zd Z xZS )FFmpegSubtitlesConvertorPPNc                 X    t                                          |           || _        d S r_   )r  r`   rA   rc   rd   rA   r  s      rD   r`   z#FFmpegSubtitlesConvertorPP.__init__  s&    $$$rF   c                 4   |                     d          }| j        }|}|dk    rd}||                     d           g |fS |                     d           g }|                                D ]'\  }}t          j                            |                     dd                    s|                     d| d	           S|d
         }||k    r|                     d| d           {|dk    r|                     d           |d         }	|                    |	           t          |	|          }
|dv r|                     d           |	}t          |	d          }t          |d          5 }t          |                                          }d d d            n# 1 swxY w Y   t          |dd          5 }|                    |           d d d            n# 1 swxY w Y   |}	d||d||<   |dk    r|                    |           |                     |	|
d|g           t          |
d          5 }||                                |
d||<   d d d            n# 1 swxY w Y   t          |d         |d                  |          |d         |
<   )||fS )Nr  r/   r$   z%There aren't any subtitles to convertzConverting subtitlesr   r   r  r  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)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   r3   __files_to_move)r}   rA   r8  r  rx   ry   r~   r   r   r   rB  r   readr  r,  )rc   r   subsnew_ext
new_formatr  r  r  r   old_filenew_file	dfxp_filesrt_filerJ  srt_datas                  rD   r   zFFmpegSubtitlesConvertorPP.run  s   xx-..+
!J<NNCDDDt8O-... 5	C 5	CID#7>>#''*b"9"9:: ##$e$$e$e$efffe*Cg~~`G```aaa67 7 7 :H  ***(7;;H,,,##>? ? ? %	,Xu==)T** 2a'11H2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 (C'::: &aGGH%%%& & & & & & & & & & & & & & &# !$ ( T
 e##!((222OOHhz0BCCCh111 Q"FFHH ( T
               1B&'J8'1C 1CD"#H-- d""s6   ,"FF	!F	7GG	 G	6II"	%I"	r  )	rW   rX   rY   r   r  r  r`   r   r  r  s   @rD   rm  rm    s[        %/N     B# B# B# B# B# B# B#rF   rm  c                   V    e Zd ZddZd Zd Z ej        d          d             ZdS )	FFmpegSplitChaptersPPFc                 J    t                               | |           || _        d S r_   )r[   r`   _force_keyframes)rc   rd   r;  s      rD   r`   zFFmpegSplitChaptersPP.__init__  s&    $$T:666 /rF   c                    |                                 }|                    ||                    d          |                    d          |                    d          d           | j                            |d          S )Nr  r  r   )section_numbersection_titlesection_startsection_endr  )r   r  r}   r/  r0  )rc   r  r  r   s       rD   _prepare_filenamez'FFmpegSplitChaptersPP._prepare_filename  sz    yy{{$$[[11$[[66";;z22	
 
 	 	 	 00yAAArF   c           	         |                      |||          }| j                            |          sd S ||d<   |                     d||fz             |dt	          |d                   dt	          |d         |d         z
            gfS )Nr   zChapter %03d; Destination: %srb  r  z-tr   )r  r/  r1  r8  r  )rc   r  r  r   destinations        rD   _ffmpeg_args_for_chapterz.FFmpegSplitChaptersPP._ffmpeg_args_for_chapter  s    ,,VWdCC22;?? 	F)
6&+9NNOOOC-..3wz*W\-BBCCEF 	FrF   ru  c                 n   |                      |           |                    d          pg }|s|                     d           g |fS |d         }| j        r3t	          |          dk    r |                     |d |D                       }|                     dt	          |           d           t          |          D ]P\  }}|                     |dz   ||          \  }}|                     ||fg|| 	                                fg           Q||d         k    r| 
                    |d            g |fS )	Nr   z"Chapter information is unavailabler   r   c              3   &   K   | ]}|d          V  dS )r  Nr2   )rp   cs     rD   rv   z,FFmpegSplitChaptersPP.run.<locals>.<genexpr>  s&      4W4WQ|_4W4W4W4W4W4WrF   zSplitting video by chapters; z chapters found)r   )r   r}   r8  r  rM   r;  r   r  r  r   rE  )rc   r   r   in_fileidxr  r  r   s           rD   r   zFFmpegSplitChaptersPP.run	  sb   T"""88J''-2 	NN?@@@t8Oz"  	YS]]Q%6%6**74W4Wh4W4W4WXXGUs8}}UUUVVV%h// 	^ 	^LC $ = =cAgwPT U UK  7D/!2k4CXCXCZCZ5[4\]]]]d:&&&))'t)<<<4xrF   NF)	rW   rX   rY   r`   r  r  r   r  r   r2   rF   rD   r  r    sx        0 0 0 0B B B
F 
F 
F  ]u---  .-  rF   r  c                        e Zd Zej        Z ee          Zd	 fd	Ze	d             Z
d
dZed             Zd Zd Z xZS )FFmpegThumbnailsConvertorPPNc                 X    t                                          |           || _        d S r_   r  ro  s      rD   r`   z$FFmpegThumbnailsConvertorPP.__init__!  s&    $$$rF   c                 p    t          | j         d| j         d           t          j        |          dk    S )N.z.is_webp is deprecatedwebp)r   rX   rW   r   what)rS  ry   s     rD   is_webpz#FFmpegThumbnailsConvertorPP.is_webp%  s:    s~TTTTTUUU{4  F**rF   rJ   c                    |d         |         d         }t           j                            |          \  }}|r|                                dk    rt	          j        |          dk    r|                     d| d           t          |d          }t          j        ||           ||d         |         d<   t          |d         	                    |          d          |d         |<   d S d S d S d S )N
thumbnailsr   z.webpr  zCorrecting thumbnail "z" extension to webprw  )
rx   ry   splitextrK   r   r  r8  r   r   r"  )rc   r   r  thumbnail_filenamer   thumbnail_extwebp_filenames          rD   
fixup_webpz&FFmpegThumbnailsConvertorPP.fixup_webp*  s   !,/4Z@7++,>??= 	M""$$//FK@R4S4SW]4]4]_8J___``` 12Df M M
-}===6C\"3'
39J*+//0BCCV:M :M&'666	M 	M//4]4]rF   c              #   :   K   dE d {V  | dk    r
dE d {V  d S d S )N)z-updater  jpg)z-bsf:v
mjpeg2jpegr2   r  s    rD   r  z$FFmpegThumbnailsConvertorPP._options6  sO      ########////////// rF   c                    t          ||          }|                     d| d|            t          j                            |          \  }}|                     ||dk    rg ng dfg||                     |          fg           |S )NzConverting thumbnail "z" to z.gif)r3   image2z-pattern_typer  )r   r8  rx   ry   r  r  r  )rc   r  r  thumbnail_conv_filenamer   r  s         rD   convert_thumbnailz-FFmpegThumbnailsConvertorPP.convert_thumbnail<  s    "34F
"S"SU0BUUUUVVV(();<<: 
f(<(<""BkBkBklm%t}}Z'@'@AB	D 	D 	D '&rF   c                    g }d}t          |                    d          pg           D ]\  }}|                    d          }|sd}|                     ||           |d         }t          j                            |          d         dd                                          }|dk    rd}t          || j                  \  }}	|	r| 	                    d| d	|	            | 
                    ||          |d<   |                    |           t          |d
         |         |          |d
         |d         <   |s| 	                    d           ||fS )NFr  r   Tr   jpegr  zNot converting thumbnail "r  rw  z&There aren't any thumbnails to convert)r   r}   r  rx   ry   r  rK   rT   rP   r8  r  r   r   )
rc   r   r  has_thumbnailr  thumbnail_dictoriginal_thumbnailr  r  r  s
             rD   r   zFFmpegThumbnailsConvertorPP.runF  s   #,TXXl-C-C-Ir#J#J 	I 	IC!/!3!3J!?!?%  MOOD#&&&!/
!;G,,-?@@CABBGMMOOM&& %$3M4<$P$P!J	 ^<N^^S\^^___)-)?)?@RT^)_)_N:&""#5666BS&'(:;ZCI CID"#N:$>??  	FNNDEEE$$rF   r  )rJ   )rW   rX   rY   r   r  r  rE   r  r`   r[  r  r  rW  r  r  r   r  r  s   @rD   r  r    s        %0N!!.11I      + + [+
M 
M 
M 
M 0 0 \0
' ' '% % % % % % %rF   r  c                   f     e Zd Zd fd	Zd Z fdZ ej        dd          d             Z xZ	S )FFmpegConcatPPFc                 X    || _         t                                          |           d S r_   )_only_multi_videor  r`   )rc   rd   only_multi_videor  s      rD   r`   zFFmpegConcatPP.__init__c  s)    !1$$$$$rF   c                     t          |                     |          d          }|                     dd                    |                      t	          |          S )N)r   .
codec_namez	Codecs = r  )r   r   r   rB   r  )rc   r  codecss      rD   _get_codecszFFmpegConcatPP._get_codecsg  sU    d66t<<>\]]8TYYv%6%688999V}}rF   c                    | j                             |          sd S t          |          dk    rt          j                            |d                   t          j                            |          k    r"|                     d|d          d| d           t          j        |d         |           g S t          t          t          | j
        |                              dk    rt          d          |                     dt          |           d|            t                                          ||           |S )	Nr   r   zMoving "z" to "r  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/  r1  rM   rx   ry   realpathr8  r   setr  r  r
   r  rL  )rc   rF  rG  r  s      rD   rL  zFFmpegConcatPP.concat_filesl  s3   228<< 	Fx==Aw,,0@0@0J0JJJH(1+HHXHHHIIIJx{H---Is3t'223344q88%\] ] ] 	VHVVHVVWWWXx000rF   )rv  	simulatedc                    |                     d          pg }t          |          r| j        r|d         dk    rg |fS t          |dd f          rt	          d          t          |d          pg }t          |          t          |          k     rt	          d          t          |d	d
          }t          j        dt          t          |                    dk    r|d         ndi|| j	        
                    |                    }| j	                            |d          }|                     ||          }||d         dg|d<   ||fS )Nentries_typemulti_video.c                 4    | dk    ot          |          dk    S )Nrequested_downloadsr   )rM   )rg  vs     rD   r   z$FFmpegConcatPP.run.<locals>.<lambda>  s!    a;P6P6_UXYZU[U[^_U_ rF   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(   pl_video)r   r   r  )r}   anyr  r   r
   rM   r   ChainMapr  r/  _playlist_infodictr0  rL  )rc   r   r  rF  extsie_copyrG  r  s           rD   r   zFFmpegConcatPP.run~  sp   ((9%%+7|| 	s 6 	s4=M;Y;Yt8O'C)_)_#`aa 	s%&qrrr)TUU[Y[x==3w<<''%&\]]]G%K\ZZ&#c$ii..A:M:MtAwwSX'Y'+T-=-P-PQU-V-VX X#44WjII++Hh?? !5>(
 (
 '"# $$rF   r  )
rW   rX   rY   r`   r  rL  r   r  r   r  r  s   @rD   r  r  b  s        % % % % % %  
    $  ]u>>>% % ?>% % % % %rF   r  ):r   rU  rY  r#  r   rx   r?   r   r  r  r   compatr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   EXT_TO_OUT_FORMATSr}  rE   rT   rV   r[   r]  r  r  r  r  r7  rB  rF  rM  rT  r[  rd  rh  rk  rm  r  r  r  r2   rF   rD   <module>r     s|                    				 				      ! ! ! ! ! !                                                 0 
    %)6#& .'
 
k k k: : :	 	 	 	 	2 	 	 	W= W= W= W= W=- W= W= W=t
g( g( g( g( g(. g( g( g(T              0         F6 6 6 6 61 6 6 6N% N% N% N% N%/ N% N% N%bT
 T
 T
 T
 T
* T
 T
 T
n    (   8, , , , ,2 , , ,    5       /       0   .    5   *    1   & & & & &. & & &, , , , ,!3 , , ,I# I# I# I# I#!4 I# I# I#X, , , , ,/ , , ,^B% B% B% B% B%"5 B% B% B%J3% 3% 3% 3% 3%( 3% 3% 3% 3% 3%rF   