
    VGh>                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddd	d
d
ddddddddZ"dddddddddZ#d Z$d Z% G d de      Z& G d d e
      Z' G d! d"e'      Z( G d# d$e'      Z) G d% d&e)      Z* G d' d(e'      Z+ G d) d*e'      Z, G d+ d,e'      Z- G d- d.e'      Z. G d/ d0e.      Z/ G d1 d2e.      Z0 G d3 d4e.      Z1 G d5 d6e.      Z2 G d7 d8e.      Z3 G d9 d:e3      Z4 G d; d<e3      Z5 G d= d>e'      Z6 G d? d@e'      Z7 G dA dBe'      Z8 G dC dDe'      Z9y)E    N   )PostProcessor   )imghdr)MEDIA_EXTENSIONSISO639UtilsPopenPostProcessingError_get_exe_version_outputdeprecation_warningdetect_exe_versiondetermine_extdfxp2srtencodeArgumentfilter_dictfloat_or_noneis_outdated_version
orderedSetprepend_extensionreplace_extensionshell_quotetraverse_objvariadicwrite_json_fileadtsflacipodmatroskampegoggmpegtsasfwebmwebvtt)aacr   m4amkamkvmpgogvtswmawmvwebavtt)mp3
libmp3lame )r&   r%   )-fr   )r&   r%   )-bsf:aaac_adtstoasc)opuslibopusr2   )r    	libvorbisr2   )r   r   r2   )r&   N)-acodecalac)wavN)r3   r;   )r0   r%   r&   r6   vorbisr   r:   r;   c           	          t        j                  dj                  dj                  dj                  |                         S )Nz{0}(?:/{0})*$z(?:\s*\w+\s*>)?\s*(?:{})\s*|)recompileformatjoin)	supporteds    d/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/postprocessor/ffmpeg.pycreate_mapping_rerE   ?   s6    ::&--.L.S.STWT\T\]fTg.hijj    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        rD   resolve_mappingrT   C   s    
 %%c*  ZZQr7a<2a5;;=F2V\\^F!=fXFFF4<  0999rF   c                       e Zd Zy)FFmpegPostProcessorErrorN)__name__
__module____qualname__r2   rF   rD   rV   rV   R   s    rF   rV   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     rD   r`   zFFmpegPostProcessor.__init__Y   s5    tZ0"nn_dC113rF   c                 H    t        |       }|j                  |j                  fS N)r[   	_versions	_features)rf   pps     rD   get_versions_and_featuresz-FFmpegPostProcessor.get_versions_and_features^   s     ,||R\\))rF   c                 2    t         j                  |       d   S )Nr   )r[   rl   )rf   s    rD   get_versionsz FFmpegPostProcessor.get_versionsc   s    "<<ZHKKrF   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                   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rh   r2   ).0pfilenames     rD   	<genexpr>z=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>x   s     B1AMQBs   	rq   )_ffmpeg_to_avconvkeysvaluesra   _ffmpeg_locationgetospathexistsreport_warningisdirbasenamenextdirnameabspathrb   rB   replace)	re   programslocationrw   r   r   pathsr   rx   s	           @rD   rc   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1&*#6>?BGGLL!,,??H, $ww||GX-=-=h-JK77>>$'#E!H$ &E(O/ , @s   (
G2(G7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   rq   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)rd   r~   _version_cache_features_cacher   r   r?   matchgroupsearchr   
splitlinesr   )
re   progr   outverregexsregexmobjlavf_runtime_versionfeaturess
             rD   _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}rF   c                 p    t        | j                  | j                  | j                  | j                  i      S rh   )r   r   _versionprobe_basename_probe_versionre   s    rD   ri   zFFmpegPostProcessor._versions   s*    DMM4==$:M:MtObObcddrF   c                 2    | j                   }| j                  S rh   )r   r   re   _s     rD   r   zFFmpegPostProcessor.basename   s    MM}}rF   c                 2    | j                   }| j                  S rh   )r   r   r   s     rD   r   z"FFmpegPostProcessor.probe_basename   s    """rF   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   r2   )xs    rD   <lambda>z2FFmpegPostProcessor._get_version.<locals>.<lambda>   s
    ad rF   c              3   H   K   | ]  }|gj                  |        y wrh   )r   )rv   rw   re   s     rD   ry   z3FFmpegPostProcessor._get_version.<locals>.<genexpr>   s$     T1a>$":":1"=>Ts   "rq   zSupport for z; is deprecated and may be removed in a future version. Use z instead)rb   rz   r   filterr   rj   r   deprecated_feature)re   kindexecutablesr   versionr   s   `     rD   _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\%^ _rF   c                 $    | j                  d      S )Nrq   r   r   s    rD   r   zFFmpegPostProcessor._version   s      **rF   c                 $    | j                  d      S )Nrr   r   r   s    rD   r   z"FFmpegPostProcessor._probe_version   s      ++rF   c                 h    t        | j                  j                               xs | j                  d uS rh   )boolr}   r~   r   r   s    rD   	availablezFFmpegPostProcessor.available   s*    D))--/0MDMM4MMrF   c                 L    | j                   j                  | j                        S rh   )rd   r~   r   r   s    rD   
executablezFFmpegPostProcessor.executable   s    {{t}}--rF   c                     | j                   d uS rh   )r   r   s    rD   probe_availablez#FFmpegPostProcessor.probe_available   s    ""$..rF   c                 L    | j                   j                  | j                        S rh   )rd   r~   r   r   s    rD   probe_executablez$FFmpegPostProcessor.probe_executable   s    {{t2233rF   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_textr2   )r   r   s     rD   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-locationro   10-0z1.0Your copy of z is outdated, update  to version z% or newer if you encounter any errors)r   rV   r   r   r   r   )re   required_versions     rD   check_versionz!FFmpegPostProcessor.check_version   sz    ~~*+yzz%)]]h%>6Et}}.>?->STXTaTaSb c..>-??d!f g @rF   c                    | j                   s| j                  st        d      	 | j                   r| j                  t	        d      g}n| j
                  t	        d      g}|j                  | j                  |             | 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-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   )
re   r   cmdr   r   
returncodeoutputaudio_codecliner   s
             rD   get_audio_codecz#FFmpegPostProcessor.get_audio_codec   s   ##DNN%  'A  B  B	##))"?35
 OO"4(* JJt55d;<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F3 3	F?>F?c                 L   | j                   dk7  r(| j                  r| j                  d       t        d      | j	                          | j
                  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 )Nrr   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)re   r   optsr   r   r   s         rD   get_metadata_objectz'FFmpegPostProcessor.get_metadata_object  s    )+####$WX%&uvv !!>*>*?+?+6"
 	t

411$781+c2B1CDEyy4
PZP_P_gqgvgvw1zz&!!rF   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   )rv   istreamr{   values      rD   ry   z8FFmpegPostProcessor.get_stream_number.<locals>.<genexpr>-  s'     k91fl64[`6aej6jQks   $$)r   r   	enumeraterM   )re   r   r{   r   r   nums     ``  rD   get_stream_numberz%FFmpegPostProcessor.get_stream_number*  sC    **40;k	' 2k CL  rF   c                 t    t        |d      }|r*|j                  d      s| j                  |d         |d<   y y y )N)chaptersrJ   end_timefilepath)r   r~   _get_real_video_duration)re   infolast_chapters      rD   _fixup_chaptersz#FFmpegPostProcessor._fixup_chapters1  s@    #D*:; 0 0 <'+'D'DT*EU'VL$ !=<rF   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)rA   durationzffprobe returned empty durationz$Unable to determine video duration: )r   r   r   r
   msg)re   r   fatalr  es        rD   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 rh   )abs)re   d1d2	tolerances       rD   _duration_mismatchz&FFmpegPostProcessor._duration_mismatchA  s     27|i''rF   c                 Z     | j                   |D cg c]  }|g f c}||fgfi |S c c}w rh   )real_run_ffmpeg)re   input_pathsout_pathr   kwargsr   s         rD   run_ffmpeg_multiple_filesz-FFmpegPostProcessor.run_ffmpeg_multiple_filesH  s?    #t##$/0DdBZ0*"(* 	*0s   ()r   )expected_retcodesc                     j                          t        d |D              } j                  t        d      g} j                  dk(  r|t        d      t        d      gz  } fdd|fd|ffD ]:  \  }|t
        j                  j                  fd	t        |      D              z  }<  j                  d
t        |              t        j                  |dt        j                  t        j                  t        j                        \  }}}	|	t        |      vr; j                  |       t!        |j#                         j%                         d         |D ]  \  }
}|
s	 j'                  |
||        |S )Nc              3   f   K   | ])  \  }}|s	t        j                  |      j                   + y wrh   )r   statst_mtime)rv   r   r   s      rD   ry   z6FFmpegPostProcessor.real_run_ffmpeg.<locals>.<genexpr>P  s+      K'.tQTBGGDM""Ks   
1$1z-yrq   z	-loglevelzrepeat+infoc                 ,   d| | d| 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}j	                  |       gz   S c c}w )	Nr   oz	-movflagsz
+faststartr   r   r   r   )r   _configuration_argsr   r   r   )fileargsnamenumberr{   argre   s         rD   	make_argsz6FFmpegPostProcessor.real_run_ffmpeg.<locals>.make_argsX  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   r  c              3   \   K   | ]#  \  }\  }}|r |t        |      |d z          % yw)r   N)list)rv   r   r   r   arg_typer#  s       rD   ry   z6FFmpegPostProcessor.real_run_ffmpeg.<locals>.<genexpr>f  s8      1E#A|dt $T
Ha!e<1Es   ),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)re   input_path_optsoutput_path_optsr  oldest_mtimer   	path_optsr   r   r   r  r&  r#  s   `          @@rD   r  z#FFmpegPostProcessor.real_run_ffmpegM  sy    K2AK K t 45==H$N;/1NOOC	: &)/$:SBR<S#T 	EHi9??00 1E'0';1E E EC	E
 	0S1A0BCD %		d:??:??R\RaRa!c6:X&788V$*6<<>+D+D+Fr+JKK+ 	EKHax|D	E rF   c                 .     | j                   |g||fi |S rh   )r  )re   r   r  r   r  s        rD   
run_ffmpegzFFmpegPostProcessor.run_ffmpegu  s     -t--tfhOOOrF   c                 @    | j                  d      r| S | dk7  rd| z   S | S )N)zhttp://zhttps://-zfile:)r   )fns    rD   r   z-FFmpegPostProcessor._ffmpeg_filename_argumentx  s+     ==01I!Syw|0b0rF   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   rJ   )r   )strings    rD   _quote_for_ffmpegz%FFmpegPostProcessor._quote_for_ffmpeg  s]    
 W-55eSA%ayC/S6\$RjC/vcr{AVc\ArF   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.6fNr2   )rv   ts     rD   ry   z6FFmpegPostProcessor.force_keyframes.<locals>.<genexpr>  s     )IQsG*)Is   )r   r   	to_screenr1  r   r   rB   )re   rx   
timestampskeyframe_files       rD   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 rF   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-nostdinr3   concatz-safer   )	r   open
writelines_concat_specr%  r   r   r  _delete_downloaded_files)re   in_filesout_fileconcat_optsconcat_filef	out_flagss          rD   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   )rM   zipr8  r   )clsrK  rM  r  r   	directives         rD   rI  z FFmpegPostProcessor._concat_spec  s     $X.K&&h4 	=JD$#//0M0Md0STUUWXX> =	$&Kqi(9<<=	=s   AA,A,rh   )T)r   )-rW   rX   rY   contextvars
ContextVarr}   r`   staticmethodrl   rn   rz   rc   r   r   r   propertyri   	functools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  r2   rF   rD   r[   r[   V   s   -{--.?N4
 * * L L $,	B< (,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                       e Zd Zg ej                  dZ eej                               Z	 e
dge	      Zd
dZd Zd Z ej                   d      d	        Zy)FFmpegExtractAudioPPr,   bestNFc                 t    t         j                  | |       |xs d| _        t        |      | _        || _        y )Nra  )r[   r`   rP   r   _preferredquality_nopostoverwrites)re   rf   preferredcodecpreferredqualitynopostoverwritess        rD   r`   zFFmpegExtractAudioPP.__init__  s4    $$T:6%/!./?!@!1rF   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)ri  r   )r   ri  )g?   )r      )r1   r8   r%   
libfdk_aacr   r   rm  z-vbrz-q:a)rc  r~   int)re   codeclimitsqs       rD   _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#rF   c                     |g }nd|g}dg||}	 t         j                  | |||       y # t        $ r}t        d|j                         d }~ww xY w)Nr9   -vnzaudio conversion failed: )r[   r1  rV   r
   r  )re   r   r  ro  	more_optsacodec_optsr   errs           rD   r1  zFFmpegExtractAudioPP.run_ffmpeg  sk    =K$e,K00i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                  rWt        j                   j#                  |      r8t        j                   j#                  |      r| j                  d| d       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   ra  )Nz,the file is already in a common audio formatzNot converting audio z; z7WARNING: unable to obtain file audio codec with ffprober%   )r&   ra  r&   r   r0   r   rm  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_EXTSr=  r   r
   ACODECSKeyErrorrj   r~   r%  rr  r   r   rd  r   r   r   r1  r   r+  time)re   information	orig_pathr   target_format	_skip_msg	filecodec	extensionr   ru  acodec	temp_pathnew_paths                rD   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~~h'?GGNN9-NN/z9JKL{?"xj12i;


4#


9h'"*J&E ??:&2NN$))+{:'>Hk  m {K''M  >/6u~,	69>s   "I I21I2)NNNF)rW   rX   rY   r   common_audior  tupler  r{   SUPPORTED_EXTSrE   	FORMAT_REr`   rr  r1  r   _restrict_tor   r2   rF   rD   r`  r`    sl    ?*77??7<<>*N!6";N";<I2 ,	M  ]u-:( .:(rF   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 rh   superr`   rP   )re   rf   preferedformat	__class__s      rD   r`   zFFmpegVideoConvertorPP.__init__)  s    $%rF   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    rD   _optionszFFmpegVideoConvertorPP._options-  s9     &77>>>;;;  	?;s   515355Frx  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: rA   )	rK   rT   rP   r=  _ACTIONr   titler1  r  )re   r  rx   
source_extr  r  outpaths          rD   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rF   NN)rW   rX   rY   sortedr   common_videor  r  rE   r  r  r`   rZ  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                        e Zd ZdZed        Zy)FFmpegVideoRemuxerPPremuxingc                 *    t         j                         S rh   r  r  s    rD   r  zFFmpegVideoRemuxerPP._optionsG  s    "3355rF   N)rW   rX   rY   r  rZ  r  r2   rF   rD   r  r  D  s    G6 6rF   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 rh   )r  r`   _already_have_subtitle)re   rf   already_have_subtitler  s      rD   r`   zFFmpegEmbedSubtitlePP.__init__O  s    $&;#rF   rx  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|}g | j                  |d         dd}t        t        ||            D ]w  \  }\  }
}|j                  d|dz    dg       t        j                  |
      xs |
}|j                  d| d| g       |sW|j                  d| d| d| d| g       y t!        |d      }| j                  d | d!       | 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#   r/   r   Tz3Only WebVTT subtitles can be embedded in webm filesr   asszEASS subtitles cannot be properly embedded in mp4 files; expect issuesr   r   z-0:sr   z:0z-metadata:s:s:z	language=zhandler_name=title=r|  zEmbedding subtitles in "")r  r=  rB   r~   itemsr   r   r   r   r   r   r   rU  extendr   
short2longr   r  r   r  )re   r  	subtitlesrx   r   	sub_langs	sub_namessub_filenameswebm_vtt_warnmp4_ass_warnlangsub_infosub_extinput_filesr   r   r   	lang_codetemp_filenamefiles_to_deletes                       rD   r   zFFmpegEmbedSubtitlePP.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3&=W5E  &  f!56$$Xj%9:$7e;K$(M''(]^C5LW5E###$kl#	m& t8O0-0
""tE{"3
 	
 	
  )Y	)BC 	EOA|dKKAE7"./#..t4<IKK>!-9+/FGH~aS1]4&3I-aS1VD6?D E	E *(F;1(1=>&&{M4H


=(+ $ ; ;"$$rF   )NF)	rW   rX   rY   r  r`   r   r  r   r  r  s   @rD   r  r  L  s0    @N<  ]u-F% .F%rF   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 rh   )r[   r`   _add_metadata_add_chapters_add_infojson)re   rf   add_metadataadd_chaptersadd_infojsons        rD   r`   zFFmpegMetadataPP.__init__  s*    $$T:6)))rF   c              #   t   K   | dk(  }t         j                  |       E d {    |rdE d {    y y 7 7 w)Nr&   )rt  r9   r   r  )r  
audio_onlys     rD   r  zFFmpegMetadataPP._options  sA     5(
&77JGGG111  	H1s   848688Frx  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| d       | 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 "r  )r  r  r~   r   r  _get_chapter_optsr   r  _get_metadata_optsr  _get_infojson_optsr=  r   r  r(  r)  r  rJ  r   r   )re   r  rx   metadata_filenamer  optionsr  r  s           rD   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;-hZq9:&&()=OODMM$u+6AA	C 	&%%7


=(+4xrF   c              #     K   t        |dd      5 }d }d}| D ]F  }|dz  }|d|d   d	z  z  z  }|d
|d   d	z  z  z  }|j                  d      }|s8|d ||       dz  }H |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)r?   sub)r   s    rD   ffmpeg_escapez9FFmpegMetadataPP._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)rG  r~   write)r   r  rO  r  metadata_file_contentchapterchapter_titles          rD   r  z"FFmpegMetadataPP._get_chapter_opts  s     #S7; 	+q= %5!# W%)GG%%9NQU9U)VV%%wz7JT7Q)RR% 'G 4 )vmM6R5SSU-VV)W GG)*	+ %$	+ 	+s"   B?B "B 3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                 6   t        fd dgt        |xs |       D        d       }|dvrldj                  t        t        t        |                  }|j                  dd      }d   j                  t        j                  t        |       |             y y )Nc              3   J   K   | ]  }j                  |      |     y wrh   )r~   )rv   keyr  s     rD   ry   zCFFmpegMetadataPP._get_metadata_opts.<locals>.add.<locals>.<genexpr>  s+      .!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   addz0FFmpegMetadataPP._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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:rh   )collectionsdefaultdictr  ra   popr?   escaper  	fullmatchr   r   r~   r   r  ranger  
setdefault)re   r  r  
meta_regexr  r   r   r   
stream_idxfmtstream_countr  r   r  r  s    `           @@rD   r  z#FFmpegMetadataPP._get_metadata_opts  s    **40	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
**, 	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| 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:r   z-attachr  zmimetype=application/jsonzfilename=info.json)r   r   r   r  _downloaderprepare_filenamer   _ensure_dir_existsr   r   sanitize_infora   r   r   )re   r  infofn
old_stream
new_streams        rD   r  z#FFmpegMetadataPP._get_infojson_opts  sX    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!S-..!OJ t55f=:,')D:,')=
 	
s   D3D5N)TT	if_exists)rW   rX   rY   r`   rZ  r  r   r  r   r  r  r  r2   rF   rD   r  r    s\    * 2 2  ]u- .B % % :'x
rF   r  c                   \    e Zd Zej                  Z ej                  d      d        Zd Z	y)FFmpegMergerPPFrx  c                 *   |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g        | j                  d| d       | j                  |d   ||       t        j                  ||       |d   |fS )Nr   r|  r   r   r   r  r  r  r   z:a:0protocolm3u8r%   z-bsf:a:r5   r   r  z:v:0zMerging formats into "r  __files_to_merge)
r   r   r~   r  r   r   r=  r  r   rename)	re   r  rx   r  r  audio_streamsr   r)  	aac_fixups	            rD   r   zFFmpegMergerPP.run7  s:   
#)(F;f~!$':";< 	2HQwwx F*Vs$Z01
O66v>q4CWCWX[\fXgChlqCq	KK7=/!:O LM"wwx F*Vs$Z01	2 	/z;<&&t,>'?PTU
		-*&'--rF   c                     | j                   dk7  ryd}t        | j                  | j                      |      r2d| j                    d| j                    d| d}| j                  |       yy)	Nro   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   ri   r   )re   r   warnings      rD   	can_mergezFFmpegMergerPP.can_mergeK  su    ==H$!t}}-/?A&t}}o 6!!%|<L;MMceG (rF   N)
rW   rX   rY   r   r  r  r   r  r   rC  r2   rF   rD   r9  r9  4  s1    %22N]u-. ..&rF   r9  c                       e Zd Zd Zy)FFmpegFixupPostProcessorc                     t        |d      }| j                  | d| d       | j                  |||       t        j                  ||       y )Nr|  z of "r  )r   r=  r1  r   r   )re   r  rx   r  r  s        rD   _fixupzFFmpegFixupPostProcessor._fixup\  sE    )(F;#eH:Q/0-9


=(+rF   N)rW   rX   rY   rG  r2   rF   rD   rE  rE  [  s    ,rF   rE  c                   @    e Zd Z ej                  dd      d        Zy)FFmpegFixupStretchedPPF)ry  audioc                     |j                  d      }|dvr,| j                  d|d   g | j                         d|d       g |fS )Nstretched_ratior   zFixing aspect ratior   z-aspectrO  r~   rG  r   )re   r  rL  s      rD   r   zFFmpegFixupStretchedPP.runf  sl    ((#45)+KK-tJ/? BM&&(BM*3BM8G7JBM N4xrF   NrW   rX   rY   r   r  r   r2   rF   rD   rI  rI  e  s#    ]uE: ;rF   rI  c                   @    e Zd Z ej                  dd      d        Zy)FFmpegFixupM4aPPF)ry  videoc                     |j                  d      dk(  r*| j                  d|d   g | j                         dd       g |fS )N	containerm4a_dashzCorrecting containerr   r3   r   rM  re   r  s     rD   r   zFFmpegFixupM4aPP.runp  sM    88K J.KK.Z0@BiDDYDYD[Bi]aBichBij4xrF   NrN  r2   rF   rD   rP  rP  o  s#    ]uE: ;rF   rP  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&   r;  r<  r   )rA   format_nameFr   r!   zUnable to extract metadata: T)r   r   r   r
   r   r  )re   r  r  r	  s       rD   _needs_fixupzFFmpegFixupM3u8PP._needs_fixupx  s     5k^++:))&11	a//Z0@AH
 x)BeTX```	 # 	">quug FGJ	s-    BA B	B "A;6B;B  BFrx  c                     t        | j                  |            rVddg}| j                  |d         dk(  r|j                  ddg       | j	                  d|d   g | j                         |       g |fS )Nr3   r   r   r%   r4   r5   zFixing MPEG-TS in MP4 container)allrZ  r   r  rG  r   )re   r  r  s      rD   r   zFFmpegFixupM3u8PP.run  s    t  &'%=D##D$45>X78KK94
;K N1&&(N1+/N1 24xrF   N)rW   rX   rY   rZ  r   r  r   r2   rF   rD   rW  rW  w  s)    	a  ]u- .rF   rW  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 rh   )r  r`   
isinstancern  floatr  trim)re   rf   rb  r  s      rD   r`   zFFmpegFixupTimestampPP.__init__  s/    $$e---I	rF   Frx  c                     | j                   j                  d      s| j                  d       ddg}ng d}| j                  d|d   g || j	                  d      d	| j
                         g |fS )
Nr   zA re-encode is needed to fix timestamps in older versions of ffmpeg. Please install ffmpeg 4.4 or later to fixup without re-encodingz-vfzsetpts=PTS-STARTPTS)r   r   z-bsfzsetts=ts=TS-STARTPTSzFixing frame timestampr   F-ss)rj   r~   r   rG  r   rb  )re   r  r   s      rD   r   zFFmpegFixupTimestampPP.run  s    ~~!!'*RS 01DAD,d:.>@x$@xI^I^_dIe@xgl@xnrnwnw@xy4xrF   )NgMbP?)rW   rX   rY   r`   r   r  r   r  r  s   @rD   r^  r^    s)      ]u-	 .	rF   r^  c                   B    e Zd ZdZ ej
                  d      d        Zy)FFmpegCopyStreamPPzCopying streamFrx  c                 f    | j                  | j                  |d   | j                                g |fS )Nr   )rG  MESSAGEr   rU  s     rD   r   zFFmpegCopyStreamPP.run  s-    DLL$z"2D4I4I4KL4xrF   N)rW   rX   rY   rh  r   r  r   r2   rF   rD   rf  rf    s&    G]u- .rF   rf  c                       e Zd ZdZy)FFmpegFixupDurationPPzFixing video durationNrW   rX   rY   rh  r2   rF   rD   rj  rj    s    %GrF   rj  c                       e Zd ZdZy)FFmpegFixupDuplicateMoovPPzFixing duplicate MOOV atomsNrk  r2   rF   rD   rm  rm    s    +GrF   rm  c                   >     e Zd Zej                  Zd fd	Zd Z xZS )FFmpegSubtitlesConvertorPPc                 2    t         |   |       || _        y rh   )r  r`   rA   re   rf   rA   r  s      rD   r`   z#FFmpegSubtitlesConvertorPP.__init__  s    $rF   c                 T   |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| d       l|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0|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  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rbrB  rC  rD  )r   datar   r3   __files_to_move)r~   rA   r=  r  r   r   r   r   r   r   rG  r   readr  r1  )re   r  subsnew_ext
new_formatr  r  r  r   old_filenew_file	dfxp_filesrt_filerO  srt_datas                  rD   r   zFFmpegSubtitlesConvertorPP.run  sh   xx-.++
!J<NNCDt8O-. 5	CID#77>>#''*b"9:##&9$?d$efe*Cg~!3G9<_`a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$   5H%HHH	H	H'	r  )	rW   rX   rY   r   r  r  r`   r   r  r  s   @rD   ro  ro    s    %//NB#rF   ro  c                   R    e Zd ZddZd Zd Z ej                  d      d        Zy)	FFmpegSplitChaptersPPFc                 >    t         j                  | |       || _        y rh   )r[   r`   _force_keyframes)re   rf   r@  s      rD   r`   zFFmpegSplitChaptersPP.__init__  s    $$T:6 /rF   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~   r0  r1  )re   r!  r  r  s       rD   _prepare_filenamez'FFmpegSplitChaptersPP._prepare_filename  s`    yy{$$[[1$[[6";;z2	
 	 00yAArF   c           	          | j                  |||      }| j                  j                  |      sy ||d<   | j                  d||fz         |dt	        |d         dt	        |d   |d   z
        gfS )Nr   zChapter %03d; Destination: %srd  r  z-tr   )r  r0  r2  r=  r  )re   r!  r  r  destinations        rD   _ffmpeg_args_for_chapterz.FFmpegSplitChaptersPP._ffmpeg_args_for_chapter  s    ,,VWdC22;?)
6&+9NNOC-.3wz*W\-BBCEF 	FrF   rx  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	        |       d       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  Nr2   )rv   cs     rD   ry   z,FFmpegSplitChaptersPP.run.<locals>.<genexpr>%  s     4WQ|_4Ws   zSplitting video by chapters; z chapters found)r  )r  r~   r=  r  rM   r@  r   r  r  r   rJ  )re   r  r   in_fileidxr  r  r   s           rD   r   zFFmpegSplitChaptersPP.run  s   T"88J'-2NN?@t8Oz"  S]Q%6**74Wh4WXG6s8}o_UV%h/ 	^LC $ = =cAgwPT UK  7D/!2k4CXCXCZ5[4\]	^ d:&&))'t)<4xrF   NF)	rW   rX   rY   r`   r  r  r   r  r   r2   rF   rD   r  r     s4    0B
F  ]u- .rF   r  c                   |     e Zd Zej                  Z ee      Zd fd	Ze	d        Z
ddZed        Zd Zd Z xZS )	FFmpegThumbnailsConvertorPPc                 2    t         |   |       || _        y rh   r  rq  s      rD   r`   z$FFmpegThumbnailsConvertorPP.__init__3  s    $rF   c                 |    t        | j                   d| j                   d       t        j                  |      dk(  S )N.z.is_webp is deprecatedwebp)r   rX   rW   r   what)rV  r   s     rD   is_webpz#FFmpegThumbnailsConvertorPP.is_webp7  s5    s~~.a~=STU{{4 F**rF   c                    |d   |   d   }t         j                  j                  |      \  }}|r|j                         dk7  rt	        j
                  |      dk(  rg| j                  d| d       t        |d      }t        j                  ||       ||d   |   d<   t        |d   j                  |      d      |d   |<   y y y y )N
thumbnailsr   z.webpr  zCorrecting thumbnail "z" extension to webpry  )
r   r   splitextrK   r   r  r=  r   r   r"  )re   r  r  thumbnail_filenamer   thumbnail_extwebp_filenames          rD   
fixup_webpz&FFmpegThumbnailsConvertorPP.fixup_webp<  s    !,/4Z@77++,>?=""$/FKK@R4SW]4]!78J7KK^_` 12Df M

-}=6C\"3'
39J*+//0BCV:M&'6 5^/ rF   c              #   H   K   dE d {    | dk(  rdE d {    y y 7 7 w)N)z-updater  jpg)z-bsf:v
mjpeg2jpegr2   r  s    rD   r  z$FFmpegThumbnailsConvertorPP._optionsH  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)r3   image2z-pattern_typer  )r   r=  r   r   r  r  r  )re   r  r  thumbnail_conv_filenamer   r  s         rD   convert_thumbnailz-FFmpegThumbnailsConvertorPP.convert_thumbnailN  s    "34F
"S/0B/C5UV(();<: 
f(<"Bklm%t}}Z'@AB	D '&rF   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  ry  z&There aren't any thumbnails to convert)r   r~   r  r   r   r  rK   rT   rP   r=  r  r   r   )
re   r  r  has_thumbnailr  thumbnail_dictoriginal_thumbnailr  r  r  s
             rD   r   zFFmpegThumbnailsConvertorPP.runX  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$$rF   r  )rJ   )rW   rX   rY   r   r  r  rE   r  r`   r^  r  r  rZ  r  r  r   r  r  s   @rD   r  r  /  sU    %00N!.1I + +
M 0 0
'%rF   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 rh   )_only_multi_videor  r`   )re   rf   only_multi_videor  s      rD   r`   zFFmpegConcatPP.__init__u  s    !1$rF   c                     t        | j                  |      d      }| j                  ddj                  |              t	        |      S )N)r   .
codec_namez	Codecs = r  )r   r   r   rB   r  )re   r  codecss      rD   _get_codecszFFmpegConcatPP._get_codecsy  sC    d66t<>\]9TYYv%6$789V}rF   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 "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: )r0  r2  rM   r   r   realpathr=  r   setr  r  r
   r  rQ  )re   rK  rL  r  s      rD   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rF   )ry  	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   )rM   )rj  vs     rD   r   z$FFmpegConcatPP.run.<locals>.<lambda>  s    a;P6P6_UXYZU[^_U_ rF   zIConcatenation is not supported when downloading multiple separate formats).r  r   r   z4Aborting concatenation because some downloads failed).r  r   r   ).r   r   r   r   r(   pl_video)r   r   r  )r~   anyr  r   r
   rM   r   ChainMapr  r0  _playlist_infodictr1  rQ  )re   r  r  rK  extsie_copyrL  r  s           rD   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>(
 '"# $$rF   r  )
rW   rX   rY   r`   r  rQ  r   r  r   r  r  s   @rD   r  r  t  s5    %
$  ]u>% ?%rF   r  ):r   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  r9  rE  rI  rP  rW  r^  rf  rj  rm  ro  r  r  r  r2   rF   rD   <module>r     s        	 	   !      0 
   %)6#& .'
k:	2 	^=- ^=Bg(. g(T  0   F61 6N%/ N%bT
* T
n$( $N,2 ,5 / 0 .5 *1 &. &,!3 ,I#!4 I#X,/ ,^B%"5 B%J3%( 3%rF   