
    yfe                        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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!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/      Z0 G d1 d2e/      Z1 G d3 d4e/      Z2 G d5 d6e/      Z3 G d7 d8e/      Z4 G d9 d:e4      Z5 G d; d<e4      Z6 G d= d>e(      Z7 G d? d@e(      Z8 G dA dBe(      Z9 G dC dDe(      Z:y)E    N   )PostProcessor   )	functoolsimghdr)MEDIA_EXTENSIONSISO639UtilsPopenPostProcessingError_get_exe_version_outputdeprecation_warningdetect_exe_versiondetermine_extdfxp2srtencodeArgumentencodeFilename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libopusr4   )r"   	libvorbisr4   )r   r   r4   )r(   N)-acodecalac)wavN)r5   r=   )r2   r'   r(   r8   vorbisr   r<   r=   c                 n    t        j                  dj                  ddj                  |       z              S )Nz{0}(?:/{0})*$z(?:\s*\w+\s*>)?\s*(?:%s)\s*|)recompileformatjoin)	supporteds    =/usr/lib/python3/dist-packages/yt_dlp/postprocessor/ffmpeg.pycreate_mapping_rerG   ?   s-    ::&--.LsxxXaOb.bcdd    c                    |j                         j                  d      D ]_  }|j                  dd      }t        |      dk(  s|d   j                         | k(  s:|d   j                         }|| k(  r	|d|  fc S |dfc S  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targets        rF   resolve_mappingrV   C   s    
 %%c*  ZZQr7a<2a5;;=F2V\\^F!=fXFFF4<  0999rH   c                       e Zd Zy)FFmpegPostProcessorErrorN)__name__
__module____qualname__r4   rH   rF   rX   rX   R   s    rH   rX   c                      e Zd Z ej                  dd      Zd)dZed)d       Zed)d       Z	d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,y),FFmpegPostProcessorffmpeg_locationN)defaultc                     t        j                  | |       | j                  dd      | _        | j	                         | _        y )Nprefer_ffmpegT)r   __init__	get_param_prefer_ffmpeg_determine_executables_paths)self
downloaders     rF   rb   zFFmpegPostProcessor.__init__Y   s5    tZ0"nn_dC113rH   c                 H    t        |       }|j                  |j                  fS N)r]   	_versions	_features)rh   pps     rF   get_versions_and_featuresz-FFmpegPostProcessor.get_versions_and_features^   s     ,||R\\))rH   c                 2    t         j                  |       d   S )Nr   )r]   rn   )rh   s    rF   get_versionsz FFmpegPostProcessor.get_versionsc   s    "<<ZHKKrH   avconvavprobe)ffmpegffprobec                    g | j                   j                         | j                   j                         }| j                  d| j                  j                               }||D ci c]  }|| c}S t        j                  j                  |      s| j                  d| dd       i S t        j                  j                  |      r|d d c}}nt        j                  j                  |      t        fd|D        d      }t        j                  j                  t        j                  j                  |            }|| j                   j                         v rd| _        |D ci c]#  }|t        j                  j!                  ||      % }}|r`|v r\|D ]W  }t        j                  j!                  |j#                  ||            }t        j                  j                  |      sS|||<   Y |r|||<   |S c c}w c c}w )Nr^   zffmpeg-location z* does not exist! Continuing without ffmpegT)	only_oncec              3   ,   K   | ]  }|v s|  y wrj   r4   ).0pfilenames     rF   	<genexpr>z=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>x   s     B1AMQBs   	rs   )_ffmpeg_to_avconvkeysvaluesrc   _ffmpeg_locationgetospathexistsreport_warningisdirbasenamenextdirnameabspathrd   rD   replace)	rg   programslocationry   r   r   pathsr   rz   s	           @rF   re   z*FFmpegPostProcessor._determine_executablesi   s   UT++002UT5K5K5R5R5TU>>"3T5J5J5N5N5PQ"*+QAqD++ww~~h'"8*,VWcg   iIWW]]8$*2D$'GXxww''1HBBHMHggoobggooh&?@G4116688&*#6>?BGGLL!,,??H, $ww||GX-=-=h-JK77>>$'#E!H$ &E(O/ , @s   (
H +(Hc                 f   | j                   j                  |      }|| j                  v r+| j                  |   | j                  j                  |i       fS t	        |dg      }|rt        |      nd}|r5ddg}|D ],  }t        j                  ||      }|s|j                  d      }. || j                  |<   |dk7  s|s|i fS t        j                  d|      }|r!|j                  d      j                  d	d
      nd }d|v d|j                         v t        |dd      dx| j                  |<   }	||	fS )Nz-bsfsFz'(?:\d+:)?([0-9.]+)-[0-9]+ubuntu[0-9.]+$zn([0-9.]+)$r   rs   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)rf   r   _version_cache_features_cacher   r   rA   matchgroupsearchr   
splitlinesr   )
rg   progr   outverregexsregexmobjlavf_runtime_versionfeaturess
             rF   _get_ffmpeg_versionz'FFmpegPostProcessor._get_ffmpeg_version   sK   {{t$4&&&&&t,d.B.B.F.FtR.PPP%dWI6), %%:F
   (xxs+**Q-C( %(D!837NyyZ\_`IMtzz)4<<S"ESW(C/ 0023GV[\1
 	
T"X
 H}rH   c                 p    t        | j                  | j                  | j                  | j                  i      S rj   )r   r   _versionprobe_basename_probe_versionrg   s    rF   rk   zFFmpegPostProcessor._versions   s*    DMM4==$:M:MtObObcddrH   c                 2    | j                    | j                  S rj   )r   r   r   s    rF   r   zFFmpegPostProcessor.basename   s    }}rH   c                 2    | j                    | j                  S rj   )r   r   r   s    rF   r   z"FFmpegPostProcessor.probe_basename   s    """rH   c                 <    |f} j                   s| j                  |   f}t        t        d  fd|D              d d i f      \  }}}|dk(  r||c _         _        n| _        | j                  |   k(  r% j                  d j                  |    d| d       |S )Nc                     | d   S Nr   r4   )xs    rF   <lambda>z2FFmpegPostProcessor._get_version.<locals>.<lambda>   s
    ad rH   c              3   H   K   | ]  }|gj                  |        y wrj   )r   )rx   ry   rg   s     rF   r{   z3FFmpegPostProcessor._get_version.<locals>.<genexpr>   s$     T1a>$":":1"=>Ts   "rs   zSupport for z; is deprecated and may be removed in a future version. Use z instead)rd   r|   r   filterr   rl   r   deprecated_feature)rg   kindexecutablesr   versionr   s   `     rF   _get_versionz FFmpegPostProcessor._get_version   s    h""!7!7!=>K&*6TT,VX\^bdfWg'i#'88,4h)DM4>"*Dt--d33##l43I3I$3O2P QOOSfT\%^ _rH   c                 $    | j                  d      S )Nrs   r   r   s    rF   r   zFFmpegPostProcessor._version   s      **rH   c                 $    | j                  d      S )Nrt   r   r   s    rF   r   z"FFmpegPostProcessor._probe_version   s      ++rH   c                     | j                   d uS rj   )r   r   s    rF   	availablezFFmpegPostProcessor.available   s    }}D((rH   c                 L    | j                   j                  | j                        S rj   )rf   r   r   r   s    rF   
executablezFFmpegPostProcessor.executable   s    {{t}}--rH   c                     | j                   d uS rj   )r   r   s    rF   probe_availablez#FFmpegPostProcessor.probe_available   s    ""$..rH   c                 L    | j                   j                  | j                        S rj   )rf   r   r   r   s    rF   probe_executablez$FFmpegPostProcessor.probe_executable   s    {{t2233rH   extc             #   z   K   dE d {    dE d {    | r
dE d {    |dv rdE d {    y y 7 *7 "7 7 w)N)-map0)z-dnz-ignore_unknown)-ccopy)mp4movr(   )z-c:smov_textr4   )r   r   s     rF   stream_copy_optsz$FFmpegPostProcessor.stream_copy_opts   sP         .--%%%''+++ ( 	! 	.%+s0   ;3	;5;7;9;;;;c           	          | j                   st        d      | j                  dk(  rdnd}t        | j                  |      r0| j                  d| j                   d| j                   d| d       y y )	NzLffmpeg not found. Please install or provide the path using --ffmpeg-locationrq   10-0z1.0Your copy of z is outdated, update  to version z% or newer if you encounter any errors)r   rX   r   r   r   r   )rg   required_versions     rF   check_versionz!FFmpegPostProcessor.check_version   sz    ~~*+yzz%)]]h%>6Et}}.>?->STXTaTaSb c..>-??d!f g @rH   c                    | j                   s| j                  st        d      	 | j                   r"t        | j                  d      t        d      g}n!t        | j                  d      t        d      g}|j                  t        | j                  |      d             | j                  | j                   dt        |              t        j                  |dt        j                  t        j                  t        j                        \  }}}|| j                   rdndk7  ry 	 | j                   r|n|}| j                   rgd }|j#                  d	      D ]P  }|j%                  d
      r#|j#                  d      d   j'                         }7|j'                         dk(  sK|N|c S  y t)        j*                  d|      }	|	r|	j-                  d      S y # t         $ r Y y w xY w)NzXffprobe and ffmpeg not found. Please install or provide the path using --ffmpeg-locationT-show_streams-iz command line: )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   r   append_ffmpeg_filename_argumentwrite_debugr   r   r
   run
subprocessPIPEOSErrorrN   
startswithrP   rA   r   r   )
rg   r   cmdr   r   
returncodeoutputaudio_codecliner   s
             rF   get_audio_codecz#FFmpegPostProcessor.get_audio_codec   s   ##DNN%  'A  B  B	##"4#8#8$?"?35
 #4??D9"4(* JJ~d&D&DT&JDQRok#>N=OPQ).$joojooV`VeVe*g&FFJ4#7#7aQ? @  //VKT* '??=1"&**S/!"4":":"<KZZ\%77K<S&&	'  99aD zz!}$#  		s   C=G 	GGc                 `   | j                   dk7  r(| j                  r| j                  d       t        d      | j	                          t        | j                  d      t        d      t        d      t        d      t        d      t        d	      g}||z  }|j                  | j                  |             | j                  d
t        |              t        j                  |dt        j                  t        j                  t        j                        \  }}}t!        j"                  |      S )Nrt   z1Only ffprobe is supported for metadata extractionzMffprobe not found. Please install or provide the path using --ffmpeg-locationT-hide_bannerz-show_formatr   z-print_formatjsonzffprobe command line: r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   loads)rg   r   optsr   r   _s         rF   get_metadata_objectz'FFmpegPostProcessor.get_metadata_object  s    )+####$WX%&uvv 400$7>*>*?+?+6"
 	t

411$781+c2B1CDEyy4
PZP_P_gqgvgvw1zz&!!rH   c                     | j                  |      d   }t        fdt        |      D        d       }|t        |      fS )Nstreamsc              3   L   K   | ]  \  }}t        |d       k(  s|  yw)F	casesenseN)r   )rx   istreamr}   values      rF   r{   z8FFmpegPostProcessor.get_stream_number.<locals>.<genexpr>-  s'     k91fl64[`6aej6jQks   $$)r   r   	enumeraterO   )rg   r   r}   r   r   nums     ``  rF   get_stream_numberz%FFmpegPostProcessor.get_stream_number*  sC    **40;k	' 2k CL  rH   c                 t    t        |d      }|r*|j                  d      s| j                  |d         |d<   y y y )N)chaptersrL   end_timefilepath)r   r   _get_real_video_duration)rg   infolast_chapters      rF   _fixup_chaptersz#FFmpegPostProcessor._fixup_chapters1  s@    #D*:; 0 0 <'+'D'DT*EU'VL$ !=<rH   c                     	 t        t        | j                  |      d            }|st        d      |S # t        $ r$}|rt        d|j                         Y d }~y d }~ww xY w)N)rC   durationzffprobe returned empty durationz$Unable to determine video duration: )r   r   r   r   msg)rg   r   fatalr  es        rF   r  z,FFmpegPostProcessor._get_real_video_duration6  sr    	Z$T55h?AWXZH)*KLLO" 	Z),PQRQVQVPW*XYY 	Zs   25 	A"AA"c                 .    |r|sy t        ||z
        |kD  S rj   )abs)rg   d1d2	tolerances       rF   _duration_mismatchz&FFmpegPostProcessor._duration_mismatchA  s     27|i''rH   c                 Z     | j                   |D cg c]  }|g f c}||fgfi |S c c}w rj   )real_run_ffmpeg)rg   input_pathsout_pathr   kwargsr   s         rF   run_ffmpeg_multiple_filesz-FFmpegPostProcessor.run_ffmpeg_multiple_filesH  s?    #t##$/0DdBZ0*"(* 	*0s   ()r   )expected_retcodesc                     j                          t        d |D              }t         j                  d      t	        d      g} j
                  dk(  r|t	        d      t	        d      gz  } fdd|fd	|ffD ]:  \  }|t        j                  j                  fd
t        |      D              z  }<  j                  dt        |      z         t        j                  |dt        j                  t        j                  t        j                        \  }}}	|	t!        |      vr; j                  |       t#        |j%                         j'                         d         |D ]  \  }
}|
s	 j)                  |
||        |S )Nc              3   x   K   | ]2  \  }}|s	t        j                  t        |            j                   4 y wrj   )r   statr   st_mtime)rx   r   r   s      rF   r{   z6FFmpegPostProcessor.real_run_ffmpeg.<locals>.<genexpr>P  s2      [7>tQUYBGGN4()22[s   
:-:Tz-yrs   z	-loglevelzrepeat+infoc                 @   d||fz  d|z  g}|dk(  r|ddgz  }|dk(  r|j                  d       |j                  j                  |      z  }|dk(  r|j                  d	       |D cg c]  }t        |       c}t	        j                  |       d
      gz   S c c}w )Nz_%s%dz_%soz	-movflagsz
+faststartr   r   r   r   T)r   _configuration_argsr   r   r   r   )fileargsnamenumberr}   argrg   s         rF   	make_argsz6FFmpegPostProcessor.real_run_ffmpeg.<locals>.make_argsX  s    tVn,edl;Ds{l33Q;KKOD,,T]]DAADs{D!045$5!$"@"@"FMNOP5s   )Br   r  c              3   \   K   | ]#  \  }\  }}|r |t        |      |d z          % yw)r   N)list)rx   r   r   r   arg_typer#  s       rF   r{   z6FFmpegPostProcessor.real_run_ffmpeg.<locals>.<genexpr>f  s8      1E#A|dt $T
Ha!e<1Es   ),zffmpeg command line: %sr   rL   )r   minr   r   r   r   	itertoolschainfrom_iterabler   r   r   r
   r   r   r   r   rX   rP   r   	try_utime)rg   input_path_optsoutput_path_optsr  oldest_mtimer   	path_optsr   r   r   r  r&  r#  s   `          @@rF   r  z#FFmpegPostProcessor.real_run_ffmpegM  s~    [BQ[ [ doot4nT6JK==H$N;/1NOOC	P &)/$:SBR<S#T 	EHi9??00 1E'0';1E E EC	E
 	2[5EEF %		d:??:??R\RaRa!c6:X&788V$*6<<>+D+D+Fr+JKK+ 	EKHax|D	E rH   c                 .     | j                   |g||fi |S rj   )r  )rg   r   r  r   r  s        rF   
run_ffmpegzFFmpegPostProcessor.run_ffmpegu  s     -t--tfhOOOrH   c                 @    | j                  d      r| S | dk7  rd| z   S | S )N)zhttp://zhttps://-zfile:)r   )fns    rF   r   z-FFmpegPostProcessor._ffmpeg_filename_argumentx  s+     ==01I!Syw|0b0rH   c                     | j                  dd      j                  dd      } | d   dk(  r| dd  nd| z   } | d   dk(  r| d d S | dz   S )N'z'\''z'''r   r   rL   )r   )strings    rF   _quote_for_ffmpegz%FFmpegPostProcessor._quote_for_ffmpeg  s]    
 W-55eSA%ayC/S6\$RjC/vcr{AVc\ArH   c                 
   t        |      }|d   dk(  r|dd  }t        |d      }| j                  d| d       | j                  ||g | j	                  dt        |            dd	j                  d
 |D                     |S )Nr   r   zkeyframes.tempzRe-encoding "z" with appropriate keyframesFr   z-force_key_frames,c              3   $   K   | ]  }|d  
 yw)z.6fNr4   )rx   ts     rF   r{   z6FFmpegPostProcessor.force_keyframes.<locals>.<genexpr>  s     )IQsG*)Is   )r   r   	to_screenr1  r   r   rD   )rg   rz   
timestampskeyframe_files       rF   force_keyframesz#FFmpegPostProcessor.force_keyframes  s    
+
a=A#ABJ)(4DExj0LMN- 2K""5mH.E"F2K2K!$)Ij)I!I2K 	L rH   c                 \   | d}| j                  d|        t        |dd      5 }|j                  | j                  ||             ddd       t	        | j                  t        |                  }| j                  |g dfg||fg       | j                  |       y# 1 sw Y   YxY w)	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-nostdinr5   concatz-safer   )	r   open
writelines_concat_specr%  r   r   r  _delete_downloaded_files)rg   in_filesout_fileconcat_optsconcat_filef	out_flagss          rF   concat_filesz FFmpegPostProcessor.concat_files  s     "
'*2;-@A+sW5 	CLL**8[AB	C ..=3J.KL	UVW	"#	% 	%%k2	C 	Cs   "B""B+c              #      K   |i gt        |      z  }d t        ||      D ]D  \  }}d| j                  | j                  |             d dD ]  }||v s| d||    d  F y w)Nzffconcat version 1.0
zfile r   )inpointoutpointr  r   )rO   zipr8  r   )clsrK  rM  r  r   	directives         rF   rI  z FFmpegPostProcessor._concat_spec  s     $X.K&&h4 	=JD$#//0M0Md0STUUWXX> =	$&Kqi(9<<=	=s   AA,A,rj   )T)r   )-rY   rZ   r[   contextvars
ContextVarr   rb   staticmethodrn   rp   r|   re   r   r   r   propertyrk   r   cached_propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r1  r   r8  r@  rQ  classmethodrI  r4   rH   rF   r]   r]   V   s   -{--.?N4
 * * L L $,	B< (,TlB#NO: e e   # # + + , , ) ) . . / / 4 4 ,4 , ,g#J .0 ",!W
	Z(*
 W[ &PP 1 1 B B	3& 	= 	=rH   r]   c                       e Zd Zej                  dz   Z eej                               Z	 e
dge	      Zd
dZd Zd Z ej                   d      d	        Zy)FFmpegExtractAudioPP)r.   bestNFc                 t    t         j                  | |       |xs d| _        t        |      | _        || _        y )Nr`  )r]   rb   rR   r   _preferredquality_nopostoverwrites)rg   rh   preferredcodecpreferredqualitynopostoverwritess        rF   rb   zFFmpegExtractAudioPP.__init__  s4    $$T:6%/!./?!@!1rH   c                    | j                   g S | j                   dkD  rd| j                    dgS dddddj                  |      }|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)rh  r   )r   rh  )g?   )r      )r3   r:   r'   
libfdk_aacr   r   rl  z-vbrz-q:a)rb  r   int)rg   codeclimitsqs       rF   _quality_argsz"FFmpegExtractAudioPP._quality_args  s    !!)I##b(t556a899 "   
 #e* 	 I1IVAY.43I3IB3NOOL s1vh((1#rH   c                     |g }nd|g}dg|z   |z   }	 t         j                  | |||       y # t        $ r}t        d|j                         d }~ww xY w)Nr;   -vnzaudio conversion failed: )r]   r1  rX   r   r  )rg   r   r  rn  	more_optsacodec_optsr   errs           rF   r1  zFFmpegExtractAudioPP.run_ffmpeg  sj    =K$e,Kw$y0	M**4xF' 	M%(A#''&KLL	Ms   - 	AAAimagesc                    |d   x}}t        |d   | j                        \  }}|dk(  r|d   | j                  v rd\  }}|s| j                  d| d|        g |fS | j	                  |      }|t        d      |dk(  r|d	v rg t        d
   d\  }}}	}
nP|dk(  s||k(  r	 g t        |   d\  }}}	}
n1t        |   \  }}
}	|
dk(  r| j                  j                  d      rdg }	}
t        |	      }	|
dk7  r| j                  |
      }	t        |||d         x}}||k(  r8|
dk(  r| j                  d| d|        g |fS t        |d      }t        |d      }| j                  rht        j                   j#                  t%        |            r@t        j                   j#                  t%        |            r| j                  d|z         g |fS | j                  d|        | j'                  |||
|	       t        j(                  ||       t        j(                  ||       ||d<   ||d<   |j                  d      *| j+                  |t-        j,                         |d   d       |g|fS # t        $ r t        d   \  }}
}	Y w xY w)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   r2   r   rl  z#; file is already in target format origtempz%Post-process file %s exists, skippingzDestination: filetimez!Cannot update utime of audio file)errnote)rV   rR   COMMON_AUDIO_EXTSr=  r   r   ACODECSKeyErrorrl   r   r%  rq  r   r   rc  r   r   r   r   r1  r   r+  time)rg   information	orig_pathr   target_format	_skip_msg	filecodec	extensionr   rt  acodec	temp_pathnew_paths                rF   r   zFFmpegExtractAudioPP.run  s   &z22	D#2;u3Et||#T yF"{5'9T=S=S'S'[$M9NN29+R	{KL{?"((.	%&_``-?"B.Ewu~.Ev.E+Iq)Vf$(B>2M793E2Mv2M/	1i
 ,3=+A(Ivy4>>#5#5e#<$0"	O	V**62I0y+eBTUU	Ht!6ykAderdstu;&)$7I)$7I""rww~~nX6N'OGGNN>)#<=NNBXMN{?"xj12i;


4#


9h'"*J&E ??:&2NN$))+{:'>Hk  m {K''M  >/6u~,	69>s   "I) )JJ)NNNF)rY   rZ   r[   r   common_audior~  tupler  r}   SUPPORTED_EXTSrG   	FORMAT_RErb   rq  r1  r   _restrict_tor   r4   rH   rF   r_  r_    sf    (55	A7<<>*N!6";N";<I2 ,	M  ]u-:( .:(rH   r_  c                        e Zd Zg  eg ej
                  d       eg ej                  dd      Z ee      Z	dZ
d
 fd	Zed        Z ej                  d      d	        Z xZS )FFmpegVideoConvertorPPgifr'   r>   
convertingc                 2    t         |   |       || _        y rj   superrb   rR   )rg   rh   preferedformat	__class__s      rF   rb   zFFmpegVideoConvertorPP.__init__)  s    $%rH   c              #   n   K   t         j                  d      E d {    | dk(  rdE d {    y y 7 7 w)NFavi)z-c:vlibxvidz-vtagXVIDr]   r   
target_exts    rF   _optionszFFmpegVideoConvertorPP._options-  s9     &77>>>;;;  	?;s   515355Frw  c           	         |d   |d   j                         }}t        || j                        \  }}|r(| j                  d| j                   d| d|        g |fS t        |||      }| j                  | j                  j                          d| d| d|        | j                  ||| j                  |             ||d<   |x|d	<   |d<   |g|fS )
Nr   r   zNot z media file ""; z video from z to z; Destination: rC   )	rM   rV   rR   r=  _ACTIONr   titler1  r  )rg   r  rz   
source_extr  r  outpaths          rF   r   zFFmpegVideoConvertorPP.run3  s    #J/e1B1B1D* /
DLL I
INNT$,,}XJc)UVt8O#Hj*E$,,,,./|J<tJ<Wfgnfopq'4==+DE"Z'11Xez4rH   NN)rY   rZ   r[   sortedr   common_videor  r  rG   r  r  rb   rZ  r  r   r  r   __classcell__r  s   @rF   r  r  !  s    	7"//77	8	A"//AAA	BN ".1IG& < <
  ]u-  . rH   r  c                        e Zd ZdZed        Zy)FFmpegVideoRemuxerPPremuxingc                 *    t         j                         S rj   r  r  s    rF   r  zFFmpegVideoRemuxerPP._optionsG  s    "3355rH   N)rY   rZ   r[   r  rZ  r  r4   rH   rF   r  r  D  s    G6 6rH   r  c                   V     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)   Fc                 2    t         |   |       || _        y rj   )r  rb   _already_have_subtitle)rg   rh   already_have_subtitler  s      rF   rb   zFFmpegEmbedSubtitlePP.__init__O  s    $&;#rH   rw  c                 F   |d   | j                   vr2| j                  ddj                  | j                          d       g |fS |j                  d      }|s| j                  d       g |fS |d   }	 |d   }g g g }}}d}d}	|j	                         D ]  \  }
}t
        j                  j                  |j                  dd	            s| j                  d
|
 d       K|d   }|dk(  r| j                  d       nt|dk7  s
|dk(  rK|dk(  rF|j                  |
       |j                  |j                  d             |j                  |d          n|s|dk(  r|dk7  rd}| j                  d       |	r|dk(  s|dk(  sd}	| j                  d        |sg |fS |g|z   }g | j                  |d         dd}t        t        ||            D ]w  \  }\  }
}|j                  dd|dz   z  g       t        j                  |
      xs |
}|j                  d|z  d|z  g       |sW|j                  d|z  d|z  d|z  d|z  g       y t!        |d      }| j                  d |z         | j#                  |||       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%   r1   r   Tz3Only WebVTT subtitles can be embedded in webm filesr   asszEASS subtitles cannot be properly embedded in mp4 files; expect issuesr   r   z-0:sz%d:0r   z-metadata:s:s:%dzlanguage=%szhandler_name=%sztitle=%sr{  zEmbedding subtitles in "%s")r  r=  rD   r   itemsr   r   r   r   r   r   r   rU  extendr	   
short2longr   r  r   r  )rg   r  	subtitlesrz   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                       rF   r   zFFmpegEmbedSubtitlePP.runS  s   ;d111NN?		$J]J]@^?__efgt8OHH23	NNABt8O
#
	 5k.0"bm9	'oo/ 	mND(77>>(,,z2">?##&9$?d$efuoG& ##$GH#-Gu4D  &  f!56$$Xj%9:$7e;K$(M''(]^C5LW5E###$kl#	m& t8Oj=0
""tE{"3
 	
 	
  )Y	)BC 	IOA|dKK1q5!123#..t4<IKK+a/1JKL/!35F5M/!3Z$5FH I	I *(F;4x?@&&{M4H


=(+ $ ; ;"$$rH   )NF)	rY   rZ   r[   r  rb   r   r  r   r  r  s   @rF   r  r  L  s0    @N<  ]u-F% .F%rH   r  c                   r    e Zd Zd
dZed        Z ej                  d      d        Zed        Z	d Z
d Zy	)FFmpegMetadataPPc                 Z    t         j                  | |       || _        || _        || _        y rj   )r]   rb   _add_metadata_add_chapters_add_infojson)rg   rh   add_metadataadd_chaptersadd_infojsons        rF   rb   zFFmpegMetadataPP.__init__  s*    $$T:6)))rH   c              #   t   K   | dk(  }t         j                  |       E d {    |rdE d {    y y 7 7 w)Nr(   )rs  r;   r   r  )r  
audio_onlys     rF   r  zFFmpegMetadataPP._options  sA     5(
&77JGGG111  	H1s   848688Frw  c           
         | j                  |       |d   d }}g g }}| j                  rR|j                  d      rAt        |d      }|j	                  | j                  |d   |             |j                  |       | j                  r |j	                  | j                  |             | j                  r{|d   dv rU|j                  d      }|j	                  | j                  ||             |s@|j                  |j                  d             n| j                  du r| j                  d       |s| j                  d	       g |fS t        |d
      }| j                  d|z         | j                  ||f|t        j                  | j!                  |d         g|         | 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 addr{  zAdding metadata to "%s")r  r  r   r   r  _get_chapter_optsr   r  _get_metadata_optsr  _get_infojson_optsr=  r   r  r(  r)  r  rJ  r   r   )rg   r  rz   metadata_filenamer  optionsr  r  s           rF   r   zFFmpegMetadataPP.run  s   T"&*:&6##%r$((:"6 1(F CNN411$z2BDUVW""#45NN422489E{n,$(HH-@$A!t66t=NOP(#**4884G+HI##t+TUNN=>t8O)(F;08;<&&()=OODMM$u+6AA	C 	&%%7


=(+4xrH   c              #     K   t        |dd      5 }d }d}| D ]E  }|dz  }|d|d   d	z  z  z  }|d
|d   d	z  z  z  }|j                  d      }|s8|d ||      z  z  }G |j                  |       d d d        d y # 1 sw Y   xY ww)NrB  rC  rD  c                 0    t        j                  dd|       S )Nz([\\=;#\n])z\\\1)rA   sub)r   s    rF   ffmpeg_escapez9FFmpegMetadataPP._get_chapter_opts.<locals>.ffmpeg_escape  s    vvngt<<rH   z;FFMETADATA1
z[CHAPTER]
TIMEBASE=1/1000
z	START=%d

start_timei  zEND=%d
r   r  z	title=%s
)z-map_metadata1)rG  r   write)r   r  rO  r  metadata_file_contentchapterchapter_titles          rF   r  z"FFmpegMetadataPP._get_chapter_opts  s     #S7; 	+q= %5!# Y%)GG%%9NQU9U)VV%%wz7JT7Q)RR% 'G 4 )\M-<X-XX)Y GG)*	+ %$	+ 	+s"   B?A?!A?2B?BBc              #     K   dt        j                  t              d5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| j                  d g       v r |d!d       d"   j	                  d#d        t        j                         d$}j                         D ][  \  }}t        j                  ||      }||s"|j                  d%d&      |j                  d'      xs d"   |j                  d(      <   ] d) d"   j                         D ]  \  }}d*| d+| f  d,}j                  d-      xs gD ]  }	d.|	j                  d/      |	j                  d0      fvrd1nd2}
t        j                  |	j                  d3      xs d&      xs |	j                  d3      }t        |||
z         D ]T  }|rt        |         j!                  d3|       t        |         j                         D ]  \  }}d4| | d+| f  V ||
z  } y w)6Nr  c           
      J   t        fd dgt        t        |xs |             z   D        d       }|dvrgdj                  t	        t
        t        |                  }|j                  dd      }d   j                  t        |       D ci c]  }|| c}       y y c c}w )Nc              3   J   K   | ]  }j                  |      |     y wrj   )r   )rx   keyr  s     rF   r{   zCFFmpegMetadataPP._get_metadata_opts.<locals>.add.<locals>.<genexpr>  s+      .!88C=, S	.s    #r   )r   Nr   r   common)r   r%  r   rD   mapstrr   update)	meta_list	info_listr   meta_fr  meta_prefixmetadatas       rF   addz0FFmpegMetadataPP._get_metadata_opts.<locals>.add  s     .)4Q&7%84I_V_@`;a%a./35E J&		#c8E?";<dB/"))xPYGZ*[V65=*[\ ' +\s   
B 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albumalbum_artist)r  album_artistsdiscdisc_numbershowseries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:rj   )collectionsdefaultdictdictrc   poprA   escaper  	fullmatchr   r   r   r	   r  ranger  
setdefault)rg   r  r  
meta_regexr  r   r   r   
stream_idxfmtstream_countr  r   r  r  s    `           @@rF   r  z#FFmpegMetadataPP._get_metadata_opts  s    **40	] 	G'(FM"'7/G^$H]^J12G()GN=>FM"FHOL34N,-t~~mR@@	=)X"":t4;/00GH
**, 	cJC<<
C0D TKP==Y]_aKbC4H5djj6GH	c $##H-335 	3KD%4&% 122	3 
88/0:TF 	'C &swwx/@#''(BS.T T1Z[L))#''**=*CD[PZH[D:zL'@A BSV$//
DA#+CF#3#9#9#; BKD%)!-$q/@AABB
 ,&J	's   D!I<'I<*EI<c           	   #   n  K   |rt         j                  j                  |      s| j                  dury |xsJ d| j                  j                  |d      xs) t        | j                  j                  |      d|d         z  }| j                  j                  |      sy | j                  d|        t        | j                  j                  || j                  dd            |       ||d<   | j                  |d	   d
d      \  }}|dd|z  f |dz  }d| j                  |      d| dd| df y w)NTz%s.tempinfojsonz	info.jsonr   zWriting info-json to: clean_infojsonr  r   )tagsmimetypezapplication/jsonr   z-0:%dr   z-attachr  zmimetype=application/jsonzfilename=info.json)r   r   r   r  _downloaderprepare_filenamer   _ensure_dir_existsr   r   sanitize_inforc   r   r   )rg   r  infofn
old_stream
new_streams        rF   r  z#FFmpegMetadataPP._get_infojson_opts  sV    RWW^^F3!!- iy  11$
C h$T%5%5%F%Ft%Lk[_`e[fg iF ##66v>5fX>?D,,::4P`bfAghjpq(.D$%!%!7!7Z8HJ^`r!s
J!7Z/00!OJ t55f=:,')D:,')=
 	
s   D3D5N)TT	if_exists)rY   rZ   r[   rb   rZ  r  r   r  r   r  r  r  r4   rH   rF   r  r    s\    * 2 2  ]u- .B % % :'x
rH   r  c                   \    e Zd Zej                  Z ej                  d      d        Zd Z	y)FFmpegMergerPPFrw  c                 L   |d   }t        |d      }ddg}d}t        |d         D ]  \  }}|j                  d      dk7  r`|j                  d	| d
g       |d   j	                  d      xr | j                  |d         dk(  }|r|j                  d| dg       |dz  }|j                  d      dk7  s|j                  d	d|z  g        | j                  d|z         | j                  |d   ||       t        j                  t        |      t        |             |d   |fS )Nr   r{  r   r   r   r  r  r  r   z:a:0protocolm3u8r'   z-bsf:a:r7   r   r  z%u:v:0zMerging formats into "%s"__files_to_merge)r   r   r   r  r   r   r=  r  r   renamer   )	rg   r  rz   r  r  audio_streamsr   r&  	aac_fixups	            rF   r   zFFmpegMergerPP.run7  s>   
#)(F;f~!$':";< 	6HQwwx F*Vs$Z01
O66v>q4CWCWX[\fXgChlqCq	KK7=/!:O LM"wwx F*VX^45	6 	2X=>&&t,>'?PTU
		./1IJ&'--rH   c                     | j                   dk7  ryd}t        | j                  | j                      |      r2d| j                   d| j                   d|d}| j                  |       yy)	Nrq   Tr   r   zw is outdated and unable to properly mux separate video and audio files, yt-dlp will download single file media. Update r   z or newer to fix this.F)r   r   rk   r   )rg   r   warnings      rF   	can_mergezFFmpegMergerPP.can_mergeK  sc    ==H$!t}}-/?A
  ==$--9IKG (rH   N)
rY   rZ   r[   r   r  r  r   r  r   r@  r4   rH   rF   r6  r6  4  s1    %22N]u-. ..&rH   r6  c                       e Zd Zd Zy)FFmpegFixupPostProcessorc                     t        |d      }| j                  | d| d       | j                  |||       t        j                  ||       y )Nr{  z of "")r   r=  r1  r   r   )rg   r  rz   r  r  s        rF   _fixupzFFmpegFixupPostProcessor._fixup]  sE    )(F;#eH:Q/0-9


=(+rH   N)rY   rZ   r[   rE  r4   rH   rF   rB  rB  \  s    ,rH   rB  c                   @    e Zd Z ej                  dd      d        Zy)FFmpegFixupStretchedPPF)rx  audioc                     |j                  d      }|dvr-| j                  d|d   g | j                         dd|z         g |fS )Nstretched_ratior   zFixing aspect ratior   z-aspectz%fr   rE  r   )rg   r  rJ  s      rF   r   zFFmpegFixupStretchedPP.rung  sl    ((#45)+KK-tJ/? BM&&(BM*3BM59O5KBM N4xrH   NrY   rZ   r[   r   r  r   r4   rH   rF   rG  rG  f  s#    ]uE: ;rH   rG  c                   @    e Zd Z ej                  dd      d        Zy)FFmpegFixupM4aPPF)rx  videoc                     |j                  d      dk(  r*| j                  d|d   g | j                         dd       g |fS )N	containerm4a_dashzCorrecting containerr   r5   r   rK  rg   r  s     rF   r   zFFmpegFixupM4aPP.runq  sM    88K J.KK.Z0@BiDDYDYD[Bi]aBichBij4xrH   NrL  r4   rH   rF   rN  rN  p  s#    ]uE: ;rH   rN  c                   D    e Zd Zd Z ej
                  d      d        Zy)FFmpegFixupM3u8PPc              #   
  K   |d   dv  |d   j                  d       	 | j                  |d         }t        |dd      d	k(   y # t        $ r,}| j	                  d
|j
                          d Y d }~y d }~ww xY ww)Nr   )r   r(   r8  r9  r   )rC   format_nameFr   r#   zUnable to extract metadata: T)r   r   r   r   r   r  )rg   r  r  r	  s       rF   _needs_fixupzFFmpegFixupM3u8PP._needs_fixupy  s     5k^++:))&11	a//Z0@AH
 x)BeTX```	 # 	">quug FGJ	s-    BA B	B "A;6B;B  BFrw  c                     t        | j                  |            rVddg}| j                  |d         dk(  r|j                  ddg       | j	                  d|d   g | j                         |       g |fS )Nr5   r   r   r'   r6   r7   zFixing MPEG-TS in MP4 container)allrX  r   r  rE  r   )rg   r  r  s      rF   r   zFFmpegFixupM3u8PP.run  s    t  &'%=D##D$45>X78KK94
;K N1&&(N1+/N1 24xrH   N)rY   rZ   r[   rX  r   r  r   r4   rH   rF   rU  rU  x  s)    	a  ]u- .rH   rU  c                   R     e Zd Zd fd	Z ej
                  d      d        Z xZS )FFmpegFixupTimestampPPc                 t    t         |   |       t        |t        t        f      sJ t        |      | _        y rj   )r  rb   
isinstancerm  floatr  trim)rg   rh   r`  r  s      rF   rb   zFFmpegFixupTimestampPP.__init__  s/    $$e---I	rH   Frw  c           	          | j                   j                  d      s| j                  d       ddg}ng d}| j                  d|d   |g | j	                  d      d	| j
                  z          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)rl   r   r   rE  r   r`  )rg   r  r   s      rF   r   zFFmpegFixupTimestampPP.run  s    ~~!!'*RS 01DAD,d:.>GxI^I^_dIeGxglGxnrnwnwGx@xy4xrH   )NgMbP?)rY   rZ   r[   rb   r   r  r   r  r  s   @rF   r\  r\    s)      ]u-	 .	rH   r\  c                   B    e Zd ZdZ ej
                  d      d        Zy)FFmpegCopyStreamPPzCopying streamFrw  c                 f    | j                  | j                  |d   | j                                g |fS )Nr   )rE  MESSAGEr   rS  s     rF   r   zFFmpegCopyStreamPP.run  s-    DLL$z"2D4I4I4KL4xrH   N)rY   rZ   r[   rf  r   r  r   r4   rH   rF   rd  rd    s&    G]u- .rH   rd  c                       e Zd ZdZy)FFmpegFixupDurationPPzFixing video durationNrY   rZ   r[   rf  r4   rH   rF   rh  rh    s    %GrH   rh  c                       e Zd ZdZy)FFmpegFixupDuplicateMoovPPzFixing duplicate MOOV atomsNri  r4   rH   rF   rk  rk    s    +GrH   rk  c                   >     e Zd Zej                  Zd fd	Zd Z xZS )FFmpegSubtitlesConvertorPPc                 2    t         |   |       || _        y rj   )r  rb   rC   rg   rh   rC   r  s      rF   rb   z#FFmpegSubtitlesConvertorPP.__init__  s    $rH   c                 R   |j                  d      }| j                  }|}|dk(  rd}|| j                  d       g |fS | j                  d       g }|j                         D ]  \  }}t        j
                  j                  |j                  dd            s| j                  d| d	       L|d
   }||k(  r| j                  d|z         k|dk(  r| j                  d       |d   }	|j                  |	       t        |	|      }
|dv r| j                  d       |	}t        |	d      }t        |d      5 }t        |j                               }d d d        t        |dd      5 }|j                         d d d        |}	d|d||<   |dk(  r/|j                  |       | j                  |	|
d|g       t        |
d      5 }||j                         |
d||<   d d d        t        |d   |d      |      |d   |
<    ||fS # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   CxY w)Nr  r1   r&   z%There aren't any subtitles to convertzConverting subtitlesr   r   r  r  r   z7Subtitle file for %s 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rbrB  rC  rD  )r   datar   r5   __files_to_move)r   rC   r=  r  r   r   r   r   r   r   rG  r   readr  r1  )rg   r  subsnew_ext
new_formatr  r  r  r   old_filenew_file	dfxp_filesrt_filerO  srt_datas                  rF   r   zFFmpegSubtitlesConvertorPP.run  sd   xx-.++
!J<NNCDt8O-. 5	CID#77>>#''*b"9:##&9$?d$efe*Cg~X[bbc67 :H  *(7;H,,##>? %	,Xu=)T* 2a'1H2 (C': &aGGH%&# !$ (T
 e#!((2OOHhz0BCh1 Q"FFH (T
 1B&'J8'1CD"#H-i5	Cn d""=2 2& &" s$   4H$HHH	H	H&	r  )	rY   rZ   r[   r   r  r  rb   r   r  r  s   @rF   rm  rm    s    %//NB#rH   rm  c                   R    e Zd ZddZd Zd Z ej                  d      d        Zy)	FFmpegSplitChaptersPPFc                 >    t         j                  | |       || _        y rj   )r]   rb   _force_keyframes)rg   rh   r@  s      rF   rb   zFFmpegSplitChaptersPP.__init__  s    $$T:6 /rH   c                     |j                         }|j                  ||j                  d      |j                  d      |j                  d      d       | j                  j	                  |d      S )Nr  r  r   )section_numbersection_titlesection_startsection_endr  )r   r  r   r-  r.  )rg   r!  r  r  s       rF   _prepare_filenamez'FFmpegSplitChaptersPP._prepare_filename  s`    yy{$$[[1$[[6";;z2	
 	 00yAArH   c           	          | j                  |||      }| j                  j                  t        |            sy ||d<   | j	                  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-  r/  r   r=  r  )rg   r!  r  r  destinations        rF   _ffmpeg_args_for_chapterz.FFmpegSplitChaptersPP._ffmpeg_args_for_chapter  s    ,,VWdC22>+3NO)
6&+9NNOC-.3wz*W\-BBCEF 	FrH   rw  c                    | j                  |       |j                  d      xs g }|s| j                  d       g |fS |d   }| j                  r't	        |      dkD  r| j                  |d |D              }| j                  dt	        |      z         t        |      D ]D  \  }}| j                  |dz   ||      \  }}| j                  ||fg|| j                         fg       F ||d   k7  r| j                  |d        g |fS )Nr   z"Chapter information is unavailabler   r   c              3   &   K   | ]	  }|d      yw)r  Nr4   )rx   cs     rF   r{   z,FFmpegSplitChaptersPP.run.<locals>.<genexpr>&  s     4WQ|_4Ws   z.Splitting video by chapters; %d chapters found)r  )r  r   r=  r  rO   r@  r   r  r  r   rJ  )rg   r  r   in_fileidxr  r  r   s           rF   r   zFFmpegSplitChaptersPP.run  s   T"88J'-2NN?@t8Oz"  S]Q%6**74Wh4WXGG#h-WX%h/ 	^LC $ = =cAgwPT UK  7D/!2k4CXCXCZ5[4\]	^ d:&&))'t)<4xrH   NF)	rY   rZ   r[   rb   r  r  r   r  r   r4   rH   rF   r  r    s4    0B
F  ]u- .rH   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 )	FFmpegThumbnailsConvertorPPc                 2    t         |   |       || _        y rj   r  ro  s      rF   rb   z$FFmpegThumbnailsConvertorPP.__init__4  s    $rH   c                 |    t        | j                   d| j                   d       t        j                  |      dk(  S )N.z.is_webp is deprecatedwebp)r   rZ   rY   r   what)rV  r   s     rF   is_webpz#FFmpegThumbnailsConvertorPP.is_webp8  s5    s~~.a~=STU{{4 F**rH   c                    |d   |   d   }t         j                  j                  |      \  }}|r|j                         dk7  rt	        j
                  |      dk(  rf| j                  d|z         t        |d      }t        j                  ||       ||d   |   d<   t        |d   j                  |      d      |d   |<   y y y y )N
thumbnailsr   z.webpr  z+Correcting thumbnail "%s" extension to webprw  )
r   r   splitextrM   r   r  r=  r   r   r  )rg   r  r  thumbnail_filenamer   thumbnail_extwebp_filenames          rF   
fixup_webpz&FFmpegThumbnailsConvertorPP.fixup_webp=  s    !,/4Z@77++,>?=""$/FKK@R4SW]4]LOaab 12Df M

-}=6C\"3'
39J*+//0BCV:M&'6 5^/ rH   c              #   H   K   dE d {    | dk(  rdE d {    y y 7 7 w)N)z-updater  jpg)z-bsf:v
mjpeg2jpegr4   r  s    rF   r  z$FFmpegThumbnailsConvertorPP._optionsI  s.     ###///  	$/s   "" ""c                     t        ||      }| j                  d| d|        t        j                  j	                  |      \  }}| j                  ||dk(  rg ng dfg|| j                  |      fg       |S )NzConverting thumbnail "z" to z.gif)r5   image2z-pattern_typer  )r   r=  r   r   r  r  r  )rg   r  r  thumbnail_conv_filenamer   r  s         rF   convert_thumbnailz-FFmpegThumbnailsConvertorPP.convert_thumbnailO  s    "34F
"S/0B/C5UV(();<: 
f(<"Bklm%t}}Z'@AB	D '&rH   c                 :   g }d}t        |j                  d      xs g       D ]  \  }}|j                  d      }|sd}| j                  ||       |d   }t        j                  j                  |      d   dd  j                         }|dk(  rd}t        || j                        \  }}	|	r| j                  d| d	|	        | j                  ||      |d<   |j                  |       t        |d
   |   |      |d
   |d   <    |s| j                  d       ||fS )NFr  r   Tr   jpegr  zNot converting thumbnail "r  rw  z&There aren't any thumbnails to convert)r   r   r  r   r   r  rM   rV   rR   r=  r  r   r   )
rg   r  r  has_thumbnailr  thumbnail_dictoriginal_thumbnailr  r  r  s
             rF   r   zFFmpegThumbnailsConvertorPP.runY  sL   #,TXXl-C-Ir#J 	IC!/!3!3J!?% MOOD#&!/
!;GG,,-?@CABGMMOM& %$3M4<<$P!J	!;<N;OsS\R]^_)-)?)?@RT^)_N:&""#56BS&'(:;ZCID"#N:$>?!	I& NNDE$$rH   r  )rL   )rY   rZ   r[   r   r  r  rG   r  rb   r]  r  r  rZ  r  r  r   r  r  s   @rF   r  r  0  sU    %00N!.1I + +
M 0 0
'%rH   r  c                   d     e Zd Zd fd	Zd Z fdZ ej                  dd      d        Z xZ	S )FFmpegConcatPPFc                 2    || _         t        | 	  |       y rj   )_only_multi_videor  rb   )rg   rh   only_multi_videor  s      rF   rb   zFFmpegConcatPP.__init__v  s    !1$rH   c                     t        | j                  |      d      }| j                  ddj                  |              t	        |      S )N)r   .
codec_namez	Codecs = r  )r   r   r   rD   r  )rg   r  codecss      rF   _get_codecszFFmpegConcatPP._get_codecsz  sC    d66t<>\]9TYYv%6$789V}rH   c                    | j                   j                  |      sy t        |      dk(  rxt        j                  j                  |d         t        j                  j                  |      k7  r| j                  d|d    d| d       t        j                  |d   |       g S t        t        t        | j                  |                  dkD  rt        d      | j                  dt        |       d|        t        | 5  ||       |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/  rO   r   r   realpathr=  r   setr  r  r   r  rQ  )rg   rK  rL  r  s      rF   rQ  zFFmpegConcatPP.concat_files  s    228<x=Aww,0@0@0JJ(1+fXJaHIJJx{H-Is3t''234q8%\] ] 	H6KH:VWXx0rH   )rx  	simulatedc                 <   |j                  d      xs g }t        |      r| j                  r|d   dk7  rg |fS t        |dd f      rt	        d      t        |d      xs g }t        |      t        |      k  rt	        d      t        |d	d
      }t        j                  dt        t        |            dk(  r|d   ndi|| j                  j                  |            }| j                  j                  |d      }| j                  ||      }||d   dg|d<   ||fS )Nentries_typemulti_video.c                 ,    | dk(  xr t        |      dkD  S )Nrequested_downloadsr   )rO   )ri  vs     rF   r   z$FFmpegConcatPP.run.<locals>.<lambda>  s    a;P6P6_UXYZU[^_U_ rH   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   rO   r  ChainMapr  r-  _playlist_infodictr.  rQ  )rg   r  r  rK  extsie_copyrL  r  s           rF   r   zFFmpegConcatPP.run  s,   ((9%+7| 6 64=M;Yt8O'C)_#`a%&qrr)TU[Y[x=3w<'%&\]]G%K\Z&&#c$i.A:MtAwSX'Y'+T-=-=-P-PQU-VX##44WjI++Hh? !5>(
 '"# $$rH   r  )
rY   rZ   r[   rb   r  rQ  r   r  r   r  r  s   @rF   r  r  u  s5    %
$  ]u>% ?%rH   r  );r  rX  r(  r   r   rA   r   r  r  r   compatr   r   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   EXT_TO_OUT_FORMATSr  rG   rV   rX   r]   r_  r  r  r  r  r6  rB  rG  rN  rU  r\  rd  rh  rk  rm  r  r  r  r4   rH   rF   <module>r     s       	 	   ! &     2 
   %)6#& .'
e:	2 	^=- ^=Bg(. g(T  0   F61 6N%/ N%bT
* T
n%( %P,2 ,5 / 0 .5 *1 &. &,!3 ,I#!4 I#X,/ ,^B%"5 B%J3%( 3%rH   