
    V|hz                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrSSK	J
r
  SSKJr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!  SSS	S
S
SSSSSSSS.r"SSSSSSSSS.r#S r$S r% " S S\5      r& " S S \
5      r' " S! S"\'5      r( " S# S$\'5      r) " S% S&\)5      r* " S' S(\'5      r+ " S) S*\'5      r, " S+ S,\'5      r- " S- S.\'5      r. " S/ S0\.5      r/ " S1 S2\.5      r0 " S3 S4\.5      r1 " S5 S6\.5      r2 " S7 S8\.5      r3 " S9 S:\35      r4 " S; S<\35      r5 " S= S>\'5      r6 " S? S@\'5      r7 " SA SB\'5      r8 " SC SD\'5      r9g)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           	          [         R                  " SR                  SR                  SR                  U 5      5      5      5      $ )Nz{0}(?:/{0})*$z(?:\s*\w+\s*>)?\s*(?:{})\s*|)recompileformatjoin)	supporteds    U/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/postprocessor/ffmpeg.pycreate_mapping_rerE   ?   s6    ::&--.L.S.STWT\T\]fTg.hijj    c                    UR                  5       R                  S5       Hb  nUR                  SS5      n[        U5      S:X  d  US   R                  5       U :X  d  M=  US   R                  5       nX@:X  a	  USU  34s  $ US4s  $    SSU  34$ )	zc
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r7a<2a5;;=F2V\\^F!=fXFFF4< + 0999rF   c                       \ rS rSrSrg)FFmpegPostProcessorErrorR   r2   N)__name__
__module____qualname____firstlineno____static_attributes__r2   rF   rD   rV   rV   R   s    rF   rV   c                      \ rS rSr\R
                  " SSS9rS(S jr\S(S j5       r	\S(S j5       r
S rSS00 srrS	 r\S
 5       r\R$                  S 5       r\R$                  S 5       rS r\R$                  S 5       r\R$                  S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S)SS.S jj5       rS rS r/ 4S jrS r S r!S)S jr"S*S jr#S r$SS.S  jr%S! r&\S" 5       r'\S# 5       r(S$ r)S(S% jr*\+S(S& j5       r,S'r-g)+FFmpegPostProcessorV   ffmpeg_locationN)defaultc                 Z    [         R                  " X5        U R                  5       U l        g N)r   __init___determine_executables_paths)self
downloaders     rD   rd   FFmpegPostProcessor.__init__Y   s     t0113rF   c                 H    [        U 5      nUR                  UR                  4$ rc   )r^   	_versions	_features)rh   pps     rD   get_versions_and_features-FFmpegPostProcessor.get_versions_and_features]   s     ,||R\\))rF   c                 2    [         R                  U 5      S   $ )Nr   )r^   rn   )rh   s    rD   get_versions FFmpegPostProcessor.get_versionsb   s    "<<ZHKKrF   c                   ^ SS/nU R                  SU R                  R                  5       5      nUc  U Vs0 s H  o3U_M     sn$ [        R                  R                  U5      (       d  U R                  SU S3SS9  0 $ [        R                  R                  U5      (       a  US S spEmOq[        R                  R                  U5      m[        U4S jU 5       S5      n[        R                  R                  [        R                  R                  U5      5      nU Vs0 s H"  o3[        R                  R                  XC5      _M$     nnU(       ah  UT;   ab  U H\  n[        R                  R                  UTR                  XS5      5      n[        R                  R                  U5      (       d  MX  XvU'   M^     U(       a  X&U'   U$ s  snf s  snf )	Nffmpegffprober`   zffmpeg-location z* does not exist! Continuing without ffmpegT)	only_oncec              3   6   >#    U  H  oT;   d  M
  Uv   M     g 7frc   r2   ).0pfilenames     rD   	<genexpr>=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>u   s     B1MQQs   		)	get_param_ffmpeg_locationgetospathexistsreport_warningisdirbasenamenextdirnameabspathrB   replace)	rg   programslocationry   r   r   pathsr   rz   s	           @rD   re   *FFmpegPostProcessor._determine_executablesf   sy   i(>>"3T5J5J5N5N5PQ"*+(QqD(++ww~~h''"8*,VWcg   iIWW]]8$$*2D$'Gxww''1HBBHMHggoobggooh&?@G6>?hBGGLL,,h?H,ww||GX-=-=h-JK77>>$''#!H  &(O+ , @s   G )Gc                    U R                   R                  U5      nX R                  ;   a+  U R                  U   U R                  R                  U0 5      4$ [	        US/5      nU(       a  [        U5      OSnU(       a=  SS/nU H3  n[        R                  " Xd5      nU(       d  M"  UR                  S5      nM5     X@R                  U'   US:w  d  U(       d  U0 4$ [        R                  " SU5      nU(       a!  UR                  S5      R                  S	S
5      OS nSU;   SUR                  5       ;   [        USS5      S.=U R                  U'   n	XI4$ )Nz-bsfsFz'(?:\d+:)?([0-9.]+)-[0-9]+ubuntu[0-9.]+$zn([0-9.]+)$r   rt   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   r?   matchgroupsearchr   
splitlinesr   )
rg   progr   outverregexsregexmobjlavf_runtime_versionfeaturess
             rD   _get_ffmpeg_version'FFmpegPostProcessor._get_ffmpeg_version   s@   {{t$&&&&&t,d.B.B.F.FtR.PPP%dWI6), %%:F
  xx+4**Q-C   %(D!837NyyZ\_`IMtzz)4<<S"ESW(C/ 0023GV[\1
 	
T"X
 }rF   c                 p    [        U R                  U R                  U R                  U R                  05      $ rc   )r   r   _versionprobe_basename_probe_versionrg   s    rD   rk   FFmpegPostProcessor._versions   s*    DMM4==$:M:MtObObcddrF   c                 2    U R                   nU R                  $ rc   )r   r   rg   _s     rD   r   FFmpegPostProcessor.basename   s    MM}}rF   c                 2    U R                   nU R                  $ rc   )r   r   r   s     rD   r   "FFmpegPostProcessor.probe_basename   s    """rF   c                    ^  U4n[        [        S U 4S jU 5       5      S S 0 45      u  p4nUS:X  a  X5sT l        T l        U$ UT l        U$ )Nc                     U S   $ Nr   r2   )xs    rD   <lambda>2FFmpegPostProcessor._get_version.<locals>.<lambda>   s    adrF   c              3   L   >#    U  H  o/TR                  U5      Q7v   M     g 7frc   )r   )rx   ry   rg   s     rD   r{   3FFmpegPostProcessor._get_version.<locals>.<genexpr>   s"     T1>$":":1"=>s   !$rt   )r   filterr   rl   r   )rg   kindexecutablesr   versionr   s   `     rD   _get_version FFmpegPostProcessor._get_version   se    h&*6TT,VX\^bdfWg'i#88,4)DM4>  #+DrF   c                 $    U R                  S5      $ )Nrt   r   r   s    rD   r   FFmpegPostProcessor._version   s      **rF   c                 $    U R                  S5      $ )Nru   r   r   s    rD   r   "FFmpegPostProcessor._probe_version   s      ++rF   c                 r    [        U R                  R                  5       5      =(       d    U R                  S L$ rc   )boolr~   r   r   r   s    rD   	availableFFmpegPostProcessor.available   s*    D))--/0MDMM4MMrF   c                 L    U R                   R                  U R                  5      $ rc   )rf   r   r   r   s    rD   
executableFFmpegPostProcessor.executable   s    {{t}}--rF   c                     U R                   S L$ rc   )r   r   s    rD   probe_available#FFmpegPostProcessor.probe_available   s    ""$..rF   c                 L    U R                   R                  U R                  5      $ rc   )rf   r   r   r   s    rD   probe_executable$FFmpegPostProcessor.probe_executable   s    {{t2233rF   extc             #      #    S S h  vN   S S h  vN   U (       a
  S S h  vN   US;   a  S S h  vN   g g  N1 N) N N7f)N)-map0)z-dnz-ignore_unknown)-ccopy)mp4movr&   )z-c:smov_textr2   )r   r   s     rD   stream_copy_opts$FFmpegPostProcessor.stream_copy_opts   sL         .--%%%''+++ ( 	! 	.%+s:   A:	A<A>AA AAA Ac           	          U R                   (       d  [        S5      eSn[        U R                  U5      (       a0  U R	                  SU R
                   SU R
                   SU S35        g g )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   )rg   required_versions     rD   check_version!FFmpegPostProcessor.check_version   sp    ~~*+yzz t}}.>??->STXTaTaSb c..>-??d!f g @rF   c                    U R                   (       d  U R                  (       d  [        S5      e U R                   (       a  U R                  [	        S5      /nOU R
                  [	        S5      /nUR                  U R                  U5      5        U R                  U R                   S[        U5       35        [        R                  " US[        R                  [        R                  [        R                  S9u  p4nXPR                   (       a  SOS:w  a  g  U R                   (       a  UOUnU R                   (       ar  S nUR!                  S	5       HZ  nUR#                  S
5      (       a$  UR!                  S5      S   R%                  5       nM=  UR%                  5       S:X  d  MS  Uc  MX  Us  $    g [&        R(                  " SU5      n	U	(       a  U	R+                  S5      $ g ! [         a     g f = f)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   )
rg   r   cmdr   r   
returncodeoutputaudio_codecliner   s
             rD   get_audio_codec#FFmpegPostProcessor.get_audio_codec   s   ##DNN%  'A  B  B	##))"?35
 OO"4(* JJt55d;<ok#>N=OPQ).$joojooV`VeVe*g&FJ#7#7aQ? @  //VKT*??=11"&**S/!"4":":"<KZZ\%77K<S&&	 +  99aD zz!}$#  		s   C&G 
G,+G,c                 T   U R                   S:w  a-  U R                  (       a  U R                  S5        [        S5      eU R	                  5         U R
                  [        S5      [        S5      [        S5      [        S5      [        S5      /nX2-  nUR                  U R                  U5      5        U R                  S	[        U5       35        [        R                  " US
[        R                  [        R                  [        R                  S9u  n  n[        R                   " U5      $ )Nru   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)rg   r   optsr   r   r   s         rD   get_metadata_object'FFmpegPostProcessor.get_metadata_object
  s    )+####$WX%&uvv !!>*>*?+?+6"
 	

411$781+c2B1CDEyy4
PZP_P_gqgvgvw1zz&!!rF   c                    ^^ U R                  U5      S   n[        UU4S j[        U5       5       S 5      nU[        U5      4$ )Nstreamsc              3   N   >#    U  H  u  p[        UTS S9T:X  d  M  Uv   M     g7f)F	casesenseN)r   )rx   istreamkeysvalues      rD   r{   8FFmpegPostProcessor.get_stream_number.<locals>.<genexpr>#  s)     k 291l64[`6aej6jQQ 2s   %	%)r   r   	enumeraterM   )rg   r   r  r	  r  nums     ``  rD   get_stream_number%FFmpegPostProcessor.get_stream_number   sC    **40;k	' 2k CL  rF   c                     [        US5      nU(       a/  UR                  S5      (       d  U R                  US   5      US'   g g g )N)chaptersrJ   end_timefilepath)r   r   _get_real_video_duration)rg   infolast_chapters      rD   _fixup_chapters#FFmpegPostProcessor._fixup_chapters'  sC    #D*:; 0 0 < <'+'D'DT*EU'VL$ !=<rF   c                      [        [        U R                  U5      S5      5      nU(       d  [        S5      eU$ ! [         a)  nU(       a  [        SUR                   35      e S nAg S nAff = f)N)rA   durationzffprobe returned empty durationz$Unable to determine video duration: )r   r   r   r
   msg)rg   r  fatalr  es        rD   r  ,FFmpegPostProcessor._get_real_video_duration,  sr    	Z$T55h?AWXZH)*KLLO" 	Z),PQRQVQVPW*XYY 	Zs   7: 
A-A((A-c                 @    U(       a  U(       d  g [        X-
  5      U:  $ rc   )abs)rg   d1d2	tolerances       rD   _duration_mismatch&FFmpegPostProcessor._duration_mismatch7  s     27|i''rF   c                 \    U R                   " U Vs/ s H  oU/ 4PM     snX#4/40 UD6$ s  snf rc   )real_run_ffmpeg)rg   input_pathsout_pathr   kwargsr   s         rD   run_ffmpeg_multiple_files-FFmpegPostProcessor.run_ffmpeg_multiple_files>  s=    ##$/0KDBZK0*"(* 	*0s   ))r   )expected_retcodesc                  ^ ^^ T R                  5         [        S U 5       5      nT R                  [        S5      /nT R                  S:X  a  U[        S5      [        S5      /-  nU 4S jmSU4SU44 H<  u  mnU[
        R                  R                  UU4S	 j[        U5       5       5      -  nM>     T R                  S
[        U5       35        [        R                  " US[        R                  [        R                  [        R                  S9u  pxn	U	[        U5      ;  a;  T R                  U5        [!        UR#                  5       R%                  5       S   5      eU H   u  pU
(       d  M  T R'                  XU5        M"     U$ )Nc              3   x   #    U  H0  u  pU(       d  M  [         R                  " U5      R                  v   M2     g 7frc   )r   statst_mtime)rx   r   r   s      rD   r{   6FFmpegPostProcessor.real_run_ffmpeg.<locals>.<genexpr>F  s)      K2AwtT"BGGDM""/s   :':z-yrt   z	-loglevelzrepeat+infoc                 8  > SU U 3SU 3/nUS:X  a  USS/-  nUS:X  a  UR                  S5        UTR                  TR                  U5      -  nUS:X  a  UR                  S5        U Vs/ s H  n[        U5      PM     snTR	                  U 5      /-   $ s  snf )	Nr   oz	-movflagsz
+faststartr   r   r  r   )r   _configuration_argsr   r   r   )fileargsnamenumberr  argrg   s         rD   	make_args6FFmpegPostProcessor.real_run_ffmpeg.<locals>.make_argsN  s    vfX&!D6
3Ds{l33Q;KKOD,,T]]DAADs{D!045$511$789:5s   ,Br  r3  c              3   n   >#    U  H*  u  nu  p#U(       d  M  T" U[        U5      TUS -   5      v   M,     g7f)r   N)list)rx   r  r   r   arg_typer:  s       rD   r{   r1  \  s9      1E';OA|t =	$T
Ha!e<<';s   55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)rg   input_path_optsoutput_path_optsr,  oldest_mtimer   	path_optsr   r   r   r(  r>  r:  s   `          @@rD   r&  #FFmpegPostProcessor.real_run_ffmpegC  sh    K2AK K t 45==H$N;/1NOOC	: &)/$:SBR<S#THi9??00 1E'0';1E E EC $U
 	0S1A0BCD %		d:??:??R\RaRa!c:X&788V$*6<<>+D+D+Fr+JKK+KHxx|D , rF   c                 ,    U R                   " U/X#40 UD6$ rc   )r*  )rg   r   r(  r   r)  s        rD   
run_ffmpegFFmpegPostProcessor.run_ffmpegk  s    --tfhOOOrF   c                 L    U R                  S5      (       a  U $ U S:w  a  SU -   $ U $ )N)zhttp://zhttps://-zfile:)r   )fns    rD   r   -FFmpegPostProcessor._ffmpeg_filename_argumentn  s.     ==011I!Syw|0b0rF   c                     U R                  SS5      R                  SS5      n U S   S:X  a  U SS  OSU -   n U S   S:X  a  U S S $ U S-   $ )N'z'\''z'''r   r   rJ   )r   )strings    rD   _quote_for_ffmpeg%FFmpegPostProcessor._quote_for_ffmpegx  s]    
 W-55eSA%ayC/S6\$RjC/vcr{AVc\ArF   c                    [        U5      nUS   S:X  a  USS  n[        US5      nU R                  SU S35        U R                  X/ U R	                  S[        U5      S9QSPS	R                  S
 U 5       5      P5        U$ )Nr   r   zkeyframes.tempzRe-encoding "z" with appropriate keyframesFr   z-force_key_frames,c              3   (   #    U  H  oS  v   M
     g7f)z.6fNr2   )rx   ts     rD   r{   6FFmpegPostProcessor.force_keyframes.<locals>.<genexpr>  s     )IjsG*js   )r   r   	to_screenrJ  r   r   rB   )rg   rz   
timestampskeyframe_files       rD   force_keyframes#FFmpegPostProcessor.force_keyframes  s    
+
a=A#ABJ)(4DExj0LMN 2K""5mH.E"F2K2K!$)Ij)I!I2K 	L rF   c                 V   U S3nU R                  SU 35        [        USSS9 nUR                  U R                  X5      5        SSS5        [	        U R                  [        U5      S95      nU R                  U/ SQ4/X&4/5        U R                  U5        g! , (       d  f       NZ= f)	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)rg   in_filesout_fileconcat_optsconcat_filef	out_flagss          rD   concat_files FFmpegPostProcessor.concat_files  s     "
'*2;-@A+sW5LL**8AB 6 ..=3J.KL	UVW"#	% 	%%k2 65s   !B
B(c              #      #    Uc  0 /[        U5      -  nSv   [        X5       HG  u  p4SU R                  U R                  U5      5       S3v   S H  nXT;   d  M
  U SXE    S3v   M     MI     g 7f)Nzffconcat version 1.0
zfile r   )inpointoutpointr  r   )rM   ziprS  r   )clsri  rk  r5  r   	directives         rD   rg   FFmpegPostProcessor._concat_spec  s     $X.K&&h4JD#//0M0Md0STUUWXX>	$&Kq(9<< ? 5s   AA0A0)rl   rf   r   r   rc   )T)r   ).rX   rY   rZ   r[   contextvars
ContextVarr~   rd   staticmethodrn   rq   re   r   r   r   propertyrk   	functoolscached_propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r#  r*  r&  rJ  r   rS  r]  ro  classmethodrg  r\   r2   rF   rD   r^   r^   V   s   "--.?N4 * * L L8 (,TlB#NO: e e   # # + + , , N N . . / / 4 4 ,4 , ,g#J .0 ",!W
	Z(*
 W[ &PP 1 1 B B	3& 	= 	=rF   r^   c                       \ rS rSr/ \R
                  QSP7r\" \R                  5       5      r
\" S/\
Q75      rSS jrS rS r\R"                  " SS	9S
 5       rSrg)FFmpegExtractAudioPPi  r,   bestNFc                 z    [         R                  X5        U=(       d    SU l        [        U5      U l        X@l        g )Nr  )r^   rd   rP   r   _preferredquality_nopostoverwrites)rg   rh   preferredcodecpreferredqualitynopostoverwritess        rD   rd   FFmpegExtractAudioPP.__init__  s0    $$T6%/!./?!@!1rF   c                    U R                   c  / $ U R                   S:  a  SU R                    S3/$ SSSSS.R                  U5      nU(       d  / $ US	   US
   US	   -
  U R                   S-  -  -   nUS:X  a  S[        U5       /$ SU /$ )N
   z-b:ak)r  r   )r   r  )g?   )r      )r1   r8   r%   
libfdk_aacr   r   r  z-vbrz-q:a)r  r   int)rg   codeclimitsqs       rD   _quality_args"FFmpegExtractAudioPP._quality_args  s    !!)I##b(t556a899 "   
 #e* 	 I1IVAY.43I3IB3NOOL s1vh((1#rF   c                     Uc  / nOSU/nS/UQUQn [         R                  XX&5        g ! [         a  n[        SUR                   35      eS nAff = f)Nr9   -vnzaudio conversion failed: )r^   rJ  rV   r
   r  )rg   r   r(  r  	more_optsacodec_optsr   errs           rD   rJ  FFmpegExtractAudioPP.run_ffmpeg  sg    =K$e,K00i0	M**4xF' 	M%(A#''&KLL	Ms   * 
AAAimagesc                    US   =p#[        US   U R                  5      u  pEUS:X  a  US   U R                  ;   a  Su  pEU(       d  U R                  SU SU 35        / U4$ U R	                  U5      nUc  [        S5      eUS:X  a  US	;   a  / [        S
   QSP7u  pxpOSUS:X  d  XF:X  a   / [        U   QSP7u  pxpO5[        U   u  pzn	U
S:X  a#  U R                  R                  S5      (       a  S/ p[        U	5      n	U
S:w  a  U R                  U
5      n	[        X7US   5      =pX:X  a9  U
S:X  a  U R                  SU SU 35        / U4$ [        US5      n[        US5      nU R                  (       aa  [        R                   R#                  U5      (       a=  [        R                   R#                  U5      (       a  U R                  SU S35        / U4$ U R                  SU 35        U R%                  X;X5        [        R&                  " X25        [        R&                  " X5        XS'   XqS'   UR                  S5      b(  U R)                  U[*        R*                  " 5       US   SS9  U/U4$ ! [         a    [        S   u  pzn	 GNf = f)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   r  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_EXTSrZ  r   r
   ACODECSKeyErrorrl   r   r=  r  r   r   r  r   r   r   rJ  r   rC  time)rg   information	orig_pathr   target_format	_skip_msg	filecodec	extensionr   r  acodec	temp_pathnew_paths                rD   r   FFmpegExtractAudioPP.run  s   &z22	#2;u3Et||#T F"{5'9T=S=S'S'[$MNN29+R	{KL{?"((.	%&_``-?"B.Ewu~.Ev.E+I)Vf$(B>2M793E2Mv2M/	i
 ,3=+A(Iy4>>#5#5e#<#<$0"	O	V**62I0+eBTUU	!6ykAderdstu;&)$7I)$7I""rww~~h'?'?GGNN9--NN/z9JKL{?"xj12;


4#


9'"*J&E ??:&2NN$))+{:'>Hk  m {K''M  >/6u~,	9>s   *I, ,JJ)r  r  rP   )NNNF)rX   rY   rZ   r[   r   common_audior  tupler  r  SUPPORTED_EXTSrE   	FORMAT_RErd   r  rJ  r   _restrict_tor   r\   r2   rF   rD   r  r    sj    ?*77??7<<>*N!6";N";<I2 ,	M u-:( .:(rF   r  c                      ^  \ rS rSr/ \" / \R                  QSP75      Q\" / \R                  QSPSP75      Q7r\	" \5      r
SrSU 4S jjr\S 5       r\R                   " SS	9S
 5       rSrU =r$ )FFmpegVideoConvertorPPi  gifr%   r<   
convertingc                 0   > [         TU ]  U5        X l        g rc   superrd   rP   )rg   rh   preferedformat	__class__s      rD   rd   FFmpegVideoConvertorPP.__init__  s    $%rF   c              #   p   #    [         R                  S5       S h  vN   U S:X  a  S S h  vN   g g  N N7f)NFavi)z-c:vlibxvidz-vtagXVIDr^   r   
target_exts    rD   _optionsFFmpegVideoConvertorPP._options#  s7     &77>>>;;;  	?;s   626466Fr  c           	         US   US   R                  5       p2[        X0R                  5      u  pEU(       a(  U R                  SU R                   SU SU 35        / U4$ [        X$U5      nU R                  U R                  R                  5        SU SU SU 35        U R                  X&U R                  U5      5        XaS'   U=US	'   US'   U/U4$ )
Nr  r   zNot z media file ""; z video from z to z; Destination: rA   )	rK   rT   rP   rZ  _ACTIONr   titlerJ  r  )rg   r  rz   
source_extr  r  outpaths          rD   r   FFmpegVideoConvertorPP.run)  s    #J/e1B1B1D* /
LL I
NNT$,,}XJc)UVt8O#H*E$,,,,./|J<tJ<Wfgnfopq4==+DE"Z'11Xez4rF   rP   NN)rX   rY   rZ   r[   sortedr   common_videor  r  rE   r  r  rd   rz  r  r   r  r   r\   __classcell__r  s   @rD   r  r    s    	7"//77	8	A"//AAA	BN ".1IG& < <
 u-  . rF   r  c                   (    \ rS rSrSr\S 5       rSrg)FFmpegVideoRemuxerPPi:  remuxingc                 *    [         R                  5       $ rc   r  r  s    rD   r  FFmpegVideoRemuxerPP._options=  s    "3355rF   r2   N)rX   rY   rZ   r[   r  rz  r  r\   r2   rF   rD   r  r  :  s    G6 6rF   r  c                   \   ^  \ rS rSrSrSU 4S jjr\R                  " SS9S 5       rSr	U =r
$ )	FFmpegEmbedSubtitlePPiB  )r   r   r&   r#   r(   r'   Fc                 0   > [         TU ]  U5        X l        g rc   )r  rd   _already_have_subtitle)rg   rh   already_have_subtitler  s      rD   rd   FFmpegEmbedSubtitlePP.__init__E  s    $&;#rF   r  c                    US   U R                   ;  a2  U R                  SSR                  U R                   5       S35        / U4$ UR                  S5      nU(       d  U R                  S5        / U4$ US   n US   n/ / / pvnSnSn	UR	                  5        GH  u  p[
        R                  R                  UR                  SS	5      5      (       d  U R                  S
U
 S35        MQ  US   nUS:X  a  U R                  S5        O~US:w  d  US:X  aL  US:X  aF  UR                  U
5        UR                  UR                  S5      5        UR                  US   5        O&U(       d  US:X  a  US:w  a  SnU R                  S5        U	(       a  M  US:X  d  M  US:X  d  GM  Sn	U R                  S5        GM     U(       d  / U4$ U/UQn/ U R                  US   S9QSPSPn[        [        XV5      5       H  u  nu  n
nUR                  SUS-    S3/5        [        R                  " U
5      =(       d    U
nUR                  SU 3SU 3/5        U(       d  Mc  UR                  SU 3SU 3SU 3SU 3/5        M     [!        US5      nU R                  S U S!35        U R#                  UUU5        [
        R$                  " UU5        U R&                  (       a  / OUnUU4$ )"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/   r7  Tz3Only WebVTT subtitles can be embedded in webm filesr   asszEASS subtitles cannot be properly embedded in mp4 files; expect issuesr   r   z-0:sr   z:0z-metadata:s:s:z	language=zhandler_name=title=r  zEmbedding subtitles in "")r  rZ  rB   r   itemsr   r   r   r   r   r   r  rt  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  r7  	lang_codetemp_filenamefiles_to_deletes                       rD   r   FFmpegEmbedSubtitlePP.runI  s   ;d111NN?		$J]J]@^?__efgt8OHH23	NNABt8O
#
	 5k.0"bm	'oo/ND77>>(,,z2">??##&9$?d$efuoG& ##$GH3&=W5E  &  f!56$$Xj%9:$7e;K$(M''(]^<C5LW5E###$kl# 0& t8O0-0
""tE{"3
 	
 	
  )Y)BCOA|dKKAE7"./#..t4<IKK>!-9+/FGHt~aS1]4&3I-aS1VD6?D E  D *(F;1(1=>&&{M4H


=(+ $ ; ;"$$rF   )r  )NF)rX   rY   rZ   r[   r  rd   r   r  r   r\   r  r  s   @rD   r  r  B  s.    @N< u-F% .F%rF   r  c                   v    \ rS rSrSS jr\S 5       r\R                  " SS9S 5       r	\S 5       r
S rS	 rS
rg)FFmpegMetadataPPi  c                 R    [         R                  X5        X l        X0l        X@l        g rc   )r^   rd   _add_metadata_add_chapters_add_infojson)rg   rh   add_metadataadd_chaptersadd_infojsons        rD   rd   FFmpegMetadataPP.__init__  s"    $$T6)))rF   c              #      #    U S:H  n[         R                  U(       + 5       S h  vN   U(       a  S S h  vN   g g  N N7f)Nr&   )r  r9   r   r  )r  
audio_onlys     rD   r  FFmpegMetadataPP._options  s?     5(
&77JGGG111  	H1s   #A=A?AAFr  c           
         U R                  U5        US   S p2/ / pTU R                  (       aW  UR                  S5      (       aA  [        US5      nUR	                  U R                  US   U5      5        UR                  U5        U R                  (       a   UR	                  U R                  U5      5        U R                  (       a  US   S;   aY  UR                  S5      nUR	                  U R                  X5      5        U(       d   UR                  UR                  S5      5        O U R                  SL a  U R                  S5        U(       d  U R                  S	5        / U4$ [        US
5      nU R                  SU S35        U R                  X#4U[        R                  " U R!                  US   5      /UQ76 5        U R"                  " U6   [$        R&                  " Xr5        / U4$ )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 "r  )r  r  r   r   r  _get_chapter_optsr   r  _get_metadata_optsr  _get_infojson_optsrZ  r   r*  r@  rA  r  rh  r   r   )rg   r  rz   metadata_filenamer  optionsr  r  s           rD   r   FFmpegMetadataPP.run  s   T"&*:&6##%r$((:"6"6 1(F CNN411$z2BDUVW""#45NN422489E{n,$(HH-@$A!t66tOP(#**4884G+HI##t+TUNN=>t8O)(F;-hZq9:&&)=OODMM$u+6AA	C 	%%7


=+4xrF   c              #   0  #    [        USSS9 nS nSnU  HM  nUS-  nUSUS   S	-  -  -  nUS
US   S	-  -  -  nUR                  S5      nU(       d  M>  USU" U5       S3-  nMO     UR                  U5        S S S 5        Sv   g ! , (       d  f       N= f7f)Nr`  ra  rb  c                 2    [         R                  " SSU 5      $ )Nz([\\=;#\n])z\\\1)r?   sub)r   s    rD   ffmpeg_escape9FFmpegMetadataPP._get_chapter_opts.<locals>.ffmpeg_escape  s    vvngt<<rF   z;FFMETADATA1
z[CHAPTER]
TIMEBASE=1/1000
z	START=%d

start_timei  zEND=%d
r  r  r  r   )z-map_metadata1)re  r   write)r  r  rm  r  metadata_file_contentchapterchapter_titles          rD   r	  "FFmpegMetadataPP._get_chapter_opts  s     #S7;q= %5!#%)GG%%9NQU9U)VV%%wz7JT7Q)RR% 'G 4 =)vmM6R5SSU-VV) $ GG)* < %$ <;s#   BAB$B8B
BBc              #   Z  ^^^#    Sm[         R                  " [        5      mS5UUU4S jjnU" SS5        U" SS5        U" SS5        U" S	S
5        U" SS5        U" SS5        U" SS5        U" SS5        U" S5        U" SS5        U" SS5        U" SS5        U" S5        U" SS5        U" SS5        SU R                  S / 5      ;   a  U" S!S5        TS"   R	                  S#S 5        [
        R                  " T5       S$3nTR                  5        Hh  u  pE[
        R                  " X45      nUc  M   U(       d  M)  UR                  S%S&5      TUR                  S'5      =(       d    S"   UR                  S(5      '   Mj     S)v   TS"   R                  5        H  u  puS*U S+U 34v   M     S,nTR                  S-5      =(       d    T/ H  n	S.U	R                  S/5      U	R                  S05      4;  a  S1OS2n
[        R                  " U	R                  S35      =(       d    S&5      =(       d    U	R                  S35      n[        XU
-   5       H[  nU(       a  T[        U5         R!                  S3U5        T[        U5         R                  5        H  u  puS4U 3U S+U 34v   M     M]     X-  nM     g 7f)6Nr  c                 F  > [        U4S jT S3/[        U=(       d    U 5      Q 5       S 5      nUS;  al  SR                  [        [        [        U5      5      5      nUR                  SS5      nTS   R                  [        R                  [        U 5      U5      5        g g )Nc              3   V   >#    U  H  nTR                  U5      c  M  TU   v   M      g 7frc   )r   )rx   keyr  s     rD   r{   CFFmpegMetadataPP._get_metadata_opts.<locals>.add.<locals>.<genexpr>  s)      .%[c88C= S	%[s   ))r   )r   Nr   r   common)	r   r   rB   mapstrr   updatedictfromkeys)	meta_list	info_listr	  r  meta_prefixmetadatas      rD   add0FFmpegMetadataPP._get_metadata_opts.<locals>.add  s     .)4Q&7%[(9CYPY:Z%[./35E J&		#c8E?";<dB/"))$--8KU*ST 'rF   r  )trackr  dateupload_date)descriptionsynopsisr0  )purlcommentwebpage_urlr-  track_numberartist)r6  artistscreatorcreatorsuploaderuploader_idcomposer)r<  	composersgenre)r>  genresalbumalbum_artist)rA  album_artistsdiscdisc_numbershowseriesseason_number
episode_id)episoderH  episode_sortepisode_numberzembed-metadatacompat_optsr3  r!  r1  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:rc   )collectionsdefaultdictr%  r}   popr?   escaper  	fullmatchr   r   r   r   r  ranger#  
setdefault)rg   r  r+  
meta_regexr  r	  r   r7  
stream_idxfmtstream_countr  r  r)  r*  s    `           @@rD   r
  #FFmpegMetadataPP._get_metadata_opts  s    **40	U 	U 	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
**,JC<<
0D TTKP==Y]_aKbC4H5djj6GH ' $##H-335KD4&% 122 6 
88/0:TF:C &swwx/@#''(BS.T T1Z[L))#''**=*CD[PZH[D:L'@ASV$//
DA#+CF#3#9#9#;KD)!-$q/@AA $< B
 &J ;s   D%J+.J+7E4J+c           	   #     #    U(       a$  [         R                  R                  U5      (       d  U R                  SLa  g U=(       dO    SU R                  R                  US5      =(       d)    [        U R                  R                  U5      SUS   5      -  nU R                  R                  U5      (       d  g U R                  SU 35        [        U R                  R                  XR                  SS5      5      U5        X!S'   U R                  US	   S
S5      u  p4Ub  SSU 34v   US-  nSU R                  U5      SU 3SSU 3S4v   g 7f)NTz%s.tempinfojsonz	info.jsonr   zWriting info-json to: clean_infojsonr  r  )tagsmimetypezapplication/jsonr   z-0:r   z-attachrQ  zmimetype=application/jsonzfilename=info.json)r   r   r   r  _downloaderprepare_filenamer   _ensure_dir_existsr   r   sanitize_infor}   r  r   )rg   r  infofn
old_stream
new_streams        rD   r  #FFmpegMetadataPP._get_infojson_opts  sW    RWW^^F3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(.$%!%!7!7Z8HJ^`r!s
!S-..!OJ t55f=:,')D:,')=
 	
s   EE)r  r  r  N)TT	if_exists)rX   rY   rZ   r[   rd   rz  r  r   r  r   r	  r
  r  r\   r2   rF   rD   r  r    sZ    * 2 2 u- .B % % :'x
rF   r  c                   ^    \ rS rSr\R
                  r\R                  " SS9S 5       r	S r
Srg)FFmpegMergerPPi*  Fr  c                 D   US   n[        US5      nSS/nSn[        US   5       H  u  pgUR                  S5      S:w  aj  UR                  S	U S
3/5        US   R	                  S5      =(       a    U R                  US   5      S:H  nU(       a  UR                  SU 3S/5        US-  nUR                  S5      S:w  d  M  UR                  S	U S3/5        M     U R                  SU S35        U R                  US   X45        [        R                  " X25        US   U4$ )Nr  r  r   r   r   rM  r  rN  r   z:a:0protocolm3u8r%   z-bsf:a:r5   r   rO  z:v:0zMerging formats into "r  __files_to_merge)
r   r  r   r  r   r   rZ  r*  r   rename)	rg   r  rz   r  r6  audio_streamsr  r[  	aac_fixups	            rD   r   FFmpegMergerPP.run-  s.   
#)(F;f~!$':";<HQwwx F*Vs$Z01
O66v>q4CWCWX[\fXgChlqCq	KK7=/!:O LM"wwx F*Vs$Z01 = 	/z;<&&t,>'?U
		-*&'--rF   c                     g)NTr2   r   s    rD   	can_mergeFFmpegMergerPP.can_mergeA  s    rF   r2   N)rX   rY   rZ   r[   r   r  r  r   r  r   rw  r\   r2   rF   rD   rm  rm  *  s/    %22Nu-. ..&rF   rm  c                       \ rS rSrS rSrg)FFmpegFixupPostProcessoriF  c                     [        US5      nU R                  U SU S35        U R                  X$U5        [        R                  " XB5        g )Nr  z of "r  )r   rZ  rJ  r   r   )rg   r  rz   r  r  s        rD   _fixupFFmpegFixupPostProcessor._fixupG  sA    )(F;#eH:Q/09


=+rF   r2   N)rX   rY   rZ   r[   r|  r\   r2   rF   rD   rz  rz  F  s    ,rF   rz  c                   B    \ rS rSr\R
                  " SSS9S 5       rSrg)FFmpegFixupStretchedPPiP  F)r  audioc                     UR                  S5      nUS;  a,  U R                  SUS   / U R                  5       QSPUS P5        / U4$ )Nstretched_ratior   zFixing aspect ratior  z-aspectrm  r   r|  r   )rg   r  r  s      rD   r   FFmpegFixupStretchedPP.runQ  sl    ((#45)+KK-tJ/? BM&&(BM*3BM8G7JBM N4xrF   r2   NrX   rY   rZ   r[   r   r  r   r\   r2   rF   rD   r  r  P  s!    uE: ;rF   r  c                   B    \ rS rSr\R
                  " SSS9S 5       rSrg)FFmpegFixupM4aPPiZ  F)r  videoc                     UR                  S5      S:X  a*  U R                  SUS   / U R                  5       QSPSP5        / U4$ )N	containerm4a_dashzCorrecting containerr  r3   r   r  rg   r  s     rD   r   FFmpegFixupM4aPP.run[  sM    88K J.KK.Z0@BiDDYDYD[Bi]aBichBij4xrF   r2   Nr  r2   rF   rD   r  r  Z  s!    uE: ;rF   r  c                   F    \ rS rSrS r\R                  " SS9S 5       rSrg)FFmpegFixupM3u8PPib  c              #     #    US   S;   v   US   R                  S5      v    U R                  US   5      n[        USSS9S	:H  v   g ! [         a,  nU R	                  S
UR
                   35        Sv    S nAg S nAff = f7f)Nr   )r   r&   ro  rp  r  )rA   format_nameFr  r!   zUnable to extract metadata: T)r   r   r   r
   r   r  )rg   r  r*  r  s       rD   _needs_fixupFFmpegFixupM3u8PP._needs_fixupc  s     5k^++:))&11	a//Z0@AH
 x)BeTX```	 # 	">quug FGJ	s-   !BA	 B	
A?"A:5B:A??BFr  c                     [        U R                  U5      5      (       aW  SS/nU R                  US   5      S:X  a  UR                  SS/5        U R	                  SUS   / U R                  5       QUQ5        / U4$ )Nr3   r   r  r%   r4   r5   zFixing MPEG-TS in MP4 container)allr  r   r  r|  r   )rg   r  r6  s      rD   r   FFmpegFixupM3u8PP.runn  s    t  &''%=D##D$45>X78KK94
;K N1&&(N1+/N1 24xrF   r2   N)	rX   rY   rZ   r[   r  r   r  r   r\   r2   rF   rD   r  r  b  s'    	a u- .rF   r  c                   X   ^  \ rS rSrSU 4S jjr\R                  " SS9S 5       rSrU =r	$ )FFmpegFixupTimestampPPiy  c                 ~   > [         TU ]  U5        [        U[        [        45      (       d   e[        U5      U l        g rc   )r  rd   
isinstancer  floatr#  trim)rg   rh   r  r  s      rD   rd   FFmpegFixupTimestampPP.__init__{  s2    $$e----I	rF   Fr  c                     U R                   R                  S5      (       d  U R                  S5        SS/nO/ SQnU R                  SUS   / UQU R	                  S5      QS	PU R
                  P5        / U4$ )
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   r|  r   r  )rg   r  r   s      rD   r   FFmpegFixupTimestampPP.run  s    ~~!!'**RS 01DAD,d:.>@x$@xI^I^_dIe@xgl@xnrnwnw@xy4xrF   )r  )NgMbP?)
rX   rY   rZ   r[   rd   r   r  r   r\   r  r  s   @rD   r  r  y  s'     u-	 .	rF   r  c                   D    \ rS rSrSr\R                  " SS9S 5       rSrg)FFmpegCopyStreamPPi  zCopying streamFr  c                 f    U R                  U R                  US   U R                  5       5        / U4$ )Nr  )r|  MESSAGEr   r  s     rD   r   FFmpegCopyStreamPP.run  s-    DLL$z"2D4I4I4KL4xrF   r2   N)	rX   rY   rZ   r[   r  r   r  r   r\   r2   rF   rD   r  r    s$    Gu- .rF   r  c                       \ rS rSrSrSrg)FFmpegFixupDurationPPi  zFixing video durationr2   NrX   rY   rZ   r[   r  r\   r2   rF   rD   r  r    s    %GrF   r  c                       \ rS rSrSrSrg)FFmpegFixupDuplicateMoovPPi  zFixing duplicate MOOV atomsr2   Nr  r2   rF   rD   r  r    s    +GrF   r  c                   J   ^  \ rS rSr\R
                  rSU 4S jjrS rSr	U =r
$ )FFmpegSubtitlesConvertorPPi  c                 0   > [         TU ]  U5        X l        g rc   )r  rd   rA   rg   rh   rA   r  s      rD   rd   #FFmpegSubtitlesConvertorPP.__init__  s    $rF   c                 |   UR                  S5      nU R                  nUnUS:X  a  SnUc  U R                  S5        / U4$ U R                  S5        / nUR                  5        GH  u  pg[        R
                  R                  UR                  SS5      5      (       d  U R                  SU S	35        MQ  US
   nX:X  a  U R                  SU S35        Mr  US:X  a  U R                  S5        M  US   n	UR                  U	5        [        X5      n
US;   a  U R                  S5        U	n[        U	S5      n[        US5       n[        UR                  5       5      nS S S 5        [        USSS9 nUR                  W5        S S S 5        Un	SWUS.X&'   US:X  a  GM7  UR                  U5        U R                  XSU/5        [        U
SS9 nUUR                  5       U
S.X&'   S S S 5        [        US   US      U5      US   U
'   GM     XQ4$ ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       NS= f)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`  ra  rb  )r   datar  r3   __files_to_move)r   rA   rZ  r  r   r   r   r   r   r   re  r   readr  rJ  )rg   r  subsnew_ext
new_formatr  r  r  r   old_filenew_file	dfxp_filesrt_filerm  srt_datas                  rD   r   FFmpegSubtitlesConvertorPP.run  sA   xx-.++
!J<NNCDt8O-.ID77>>#''*b"9::##&9$?d$efe*C~!3G9<_`a67 :H  *(;H,,##>? %	,Xu=)T*a'1H + (C':aGGH% ;# !$ (
 e#!((2OOHz0BCh1Q"FFH (
 2 1B&'J8'1CD"#H-i &n ""= +* ;:" 21s$    H-H	H-
H	
H*	-
H;	)rA   r  )rX   rY   rZ   r[   r   r  r  rd   r   r\   r  r  s   @rD   r  r    s    %//NB# B#rF   r  c                   V    \ rS rSrS
S jrS rS r\R                  " SS9S 5       r	Sr
g	)FFmpegSplitChaptersPPi  Fc                 :    [         R                  X5        X l        g rc   )r^   rd   _force_keyframes)rg   rh   r]  s      rD   rd   FFmpegSplitChaptersPP.__init__  s    $$T6 /rF   c                     UR                  5       nUR                  UUR                  S5      UR                  S5      UR                  S5      S.5        U R                  R	                  US5      $ )Nr  r  r  )section_numbersection_titlesection_startsection_endr  )r   r$  r   rc  rd  )rg   r8  r  r  s       rD   _prepare_filename'FFmpegSplitChaptersPP._prepare_filename  s`    yy{$$[[1$[[6";;z2	
 	 00yAArF   c           	          U R                  XU5      nU R                  R                  U5      (       d  g XBS'   U R                  SX4-  5        US[	        US   5      S[	        US   US   -
  5      /4$ )Nr  zChapter %03d; Destination: %sr  r  z-tr  )r  rc  re  rZ  r#  )rg   r8  r  r  destinations        rD   _ffmpeg_args_for_chapter.FFmpegSplitChaptersPP._ffmpeg_args_for_chapter  s    ,,VdC22;??)
6&9NNOC-.3wz*W\-BBCEF 	FrF   r  c                    U R                  U5        UR                  S5      =(       d    / nU(       d  U R                  S5        / U4$ US   nU R                  (       a(  [	        U5      S:  a  U R                  US U 5       5      nU R                  S[	        U5       S35        [        U5       H@  u  pEU R                  US-   XQ5      u  pgU R                  X74/X`R                  5       4/5        MB     X1S   :w  a  U R                  US S9  / U4$ )	Nr  z"Chapter information is unavailabler  r   c              3   *   #    U  H	  oS    v   M     g7f)r  Nr2   )rx   cs     rD   r{   ,FFmpegSplitChaptersPP.run.<locals>.<genexpr>  s     4Wh|_hs   zSplitting video by chapters; z chapters found)r  )r  r   rZ  r  rM   r]  r  r  r&  r   rh  )rg   r  r  in_fileidxr  r  r   s           rD   r   FFmpegSplitChaptersPP.run  s   T"88J'-2NN?@t8Oz"  S]Q%6**74Wh4WXG6s8}o_UV%h/LC $ = =cAgw UK  7/!2kCXCXCZ5[4\] 0 :&&))'t)<4xrF   )r  NF)rX   rY   rZ   r[   rd   r  r  r   r  r   r\   r2   rF   rD   r  r    s2    0B
F u- .rF   r  c                      ^  \ rS rSr\R
                  r\" \5      rS	U 4S jjr	\
S 5       rS
S jr\S 5       rS rS rSrU =r$ )FFmpegThumbnailsConvertorPPi  c                 0   > [         TU ]  U5        X l        g rc   r  r  s      rD   rd   $FFmpegThumbnailsConvertorPP.__init__  s    $rF   c                 ~    [        U R                   SU R                   S35        [        R                  " U5      S:H  $ )N.z.is_webp is deprecatedwebp)r   rY   rX   r   what)ru  r   s     rD   is_webp#FFmpegThumbnailsConvertorPP.is_webp"  s5    s~~.a~=STU{{4 F**rF   c                    US   U   S   n[         R                  R                  U5      u  pEU(       a  UR                  5       S:w  a  [        R
                  " U5      S:X  af  U R                  SU S35        [        US5      n[         R                  " X65        XaS   U   S'   [        US   R                  U5      S5      US   U'   g g g g )N
thumbnailsr  z.webpr  zCorrecting thumbnail "z" extension to webpr  )
r   r   splitextrK   r   r  rZ  r   r   rT  )rg   r  r  thumbnail_filenamer   thumbnail_extwebp_filenames          rD   
fixup_webp&FFmpegThumbnailsConvertorPP.fixup_webp'  s    !,/4Z@77++,>?""$/FKK@R4SW]4]!78J7KK^_` 12Df M

-=6C\"3'
39J*+//0BCV:M&'6 5^/ rF   c              #   J   #    S S h  vN   U S:X  a  S S h  vN   g g  N N7f)N)z-updater  jpg)z-bsf:v
mjpeg2jpegr2   r  s    rD   r  $FFmpegThumbnailsConvertorPP._options3  s,     ###///  	$/s   ##!##c                     [        X5      nU R                  SU SU 35        [        R                  R	                  U5      u  pEU R                  XS:X  a  / O/ SQ4/X0R                  U5      4/5        U$ )NzConverting thumbnail "z" to z.gif)r3   image2z-pattern_typerN  )r   rZ  r   r   r  r&  r  )rg   r  r  thumbnail_conv_filenamer   r  s         rD   convert_thumbnail-FFmpegThumbnailsConvertorPP.convert_thumbnail9  s}    "34F"S/0B/C5UV(();< f(<"Bklm%}}Z'@AB	D '&rF   c                 `   / nSn[        UR                  S5      =(       d    / 5       H  u  pEUR                  S5      nU(       d  M  SnU R                  X5        US   n[        R                  R                  U5      S   SS  R                  5       nUS:X  a  Sn[        XpR                  5      u  pU	(       a  U R                  SU S	U	 35        M  U R                  Xh5      US'   UR                  U5        [        US
   U   U5      US
   US   '   M     U(       d  U R                  S5        X!4$ )NFr  r  Tr   jpegr  zNot converting thumbnail "r  r  z&There aren't any thumbnails to convert)r  r   r  r   r   r  rK   rT   rP   rZ  r  r   r   )
rg   r  r  has_thumbnailr  thumbnail_dictoriginal_thumbnailr  r  r  s
             rD   r   FFmpegThumbnailsConvertorPP.runC  s9   #,TXXl-C-Ir#JC!/!3!3J!?% MOOD&!/
!;GG,,-?@CABGMMOM& %$3M<<$P!J!;<N;OsS\R]^_)-)?)?@R)_N:&""#56BS&'(:;ZCID"#N:$>?! $K& NNDE$$rF   r  r  )rJ   )rX   rY   rZ   r[   r   r  r  rE   r  rd   r~  r  r  rz  r  r  r   r\   r  r  s   @rD   r  r    sZ    %00N!.1I + +
M 0 0
'% %rF   r  c                   l   ^  \ rS rSrS	U 4S jjrS rU 4S jr\R                  " SSS9S 5       r	Sr
U =r$ )
FFmpegConcatPPi_  Fc                 0   > X l         [        TU ]	  U5        g rc   )_only_multi_videor  rd   )rg   rh   only_multi_videor  s      rD   rd   FFmpegConcatPP.__init__`  s    !1$rF   c                     [        U R                  U5      S5      nU R                  SSR                  U5       35        [	        U5      $ )N)r  .
codec_namez	Codecs = r  )r   r   r   rB   r  )rg   r5  codecss      rD   _get_codecsFFmpegConcatPP._get_codecsd  sC    d66t<>\]9TYYv%6$789V}rF   c                 (  > U R                   R                  U5      (       d  g [        U5      S:X  az  [        R                  R                  US   5      [        R                  R                  U5      :w  a  U R                  SUS    SU S35        [        R                  " US   U5        / $ [        [        [        U R                  U5      5      5      S:  a  [        S5      eU R                  S[        U5       SU 35        [        TU ]5  X5        U$ )	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: )rc  re  rM   r   r   realpathrZ  r   setr"  r  r
   r  ro  )rg   ri  rj  r  s      rD   ro  FFmpegConcatPP.concat_filesi  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X0rF   )r  	simulatedc                 p   UR                  S5      =(       d    / n[        U5      (       a  U R                  (       a  US   S:w  a  / U4$ [        USS 45      (       a  [	        S5      e[        US5      =(       d    / n[        U5      [        U5      :  a  [	        S5      e[        US	S
5      n[        R                  " S[        [        U5      5      S:X  a  US   OS0XR                  R                  U5      5      nU R                  R                  US5      nU R                  X65      nUUS   S./US'   Xq4$ )Nentries_typemulti_video.c                 6    U S:H  =(       a    [        U5      S:  $ )Nrequested_downloadsr   )rM   )r  vs     rD   r   $FFmpegConcatPP.run.<locals>.<lambda>  s    a;P6P6_UXYZU[^_U_6_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   rR  ChainMapr  rc  _playlist_infodictrd  ro  )rg   r  r  ri  extsie_copyrj  r  s           rD   r   FFmpegConcatPP.run{  s+   ((9%+7|| 6 64=M;Yt8O'C)_#`aa%&qrr)TU[Y[x=3w<'%&\]]G%K\Z&&#c$i.A:MtAwSX'Y'+-=-=-P-PQU-VX##44WjI++H? !5>(
 '"# $$rF   )r  r  )rX   rY   rZ   r[   rd   r  ro  r   r  r   r\   r  r  s   @rD   r  r  _  s3    %
$ u>% ?%rF   r  ):rR  rx  r|  r@  r   r   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  rm  rz  r  r  r  r  r  r  r  r  r  r  r  r2   rF   rD   <module>r     s        	 	   !      0 
   %)6#& .'
k:	2 	T=- T=n
g(. g(T  0   F61 6N%/ N%bT
* T
n( 8,2 ,5 / 0 .5 *1 &. &,!3 ,I#!4 I#X,/ ,^B%"5 B%J3%( 3%rF   