U
    gV                     @   s  d dl Z e jdk reddZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
ddlmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lm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$ ddl%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD ddlEmFZF ddlGmHZH ddlImIZI daJd,ddZKdd ZLdd ZMdd ZNdd ZOdd ZPeQd d!ZRd-d"d#ZSd.d$d%ZTd/d&d'ZUdd(lmVZVmWZW d'd)d#d*d+gZXdS )0    N)      zjYou are using an unsupported version of Python. Only Python versions 3.8 and above are supported by yt-dlpzThe Unlicense   )compat_os_name)SUPPORTED_BROWSERSSUPPORTED_KEYRINGSCookieLoadError)get_external_downloader)list_extractor_classes)MSO_INFO)ImpersonateTarget)	parseOpts)	FFmpegExtractAudioPPFFmpegMergerPPFFmpegPostProcessorFFmpegSubtitlesConvertorPPFFmpegThumbnailsConvertorPPFFmpegVideoConvertorPPFFmpegVideoRemuxerPPMetadataFromFieldPPMetadataParserPP)Updater)Config
NO_DEFAULTPOSTPROCESS_WHEN	DateRangeDownloadCancelledDownloadErrorFormatSorterGeoUtilsPlaylistEntriesSameFileErrordecodeOptiondownload_range_funcexpand_pathfloat_or_noneformat_fieldint_or_nonejoin_nonemptymatch_filter_funcparse_bytesparse_durationpreferredencodingread_batch_urls
read_stdinrender_tablesetproctitleshell_quotetraverse_objvariadicwrite_string)std_headers)_UnsafeExtensionError)	YoutubeDLFc                 G   s"   |D ]}t j| qt| d S N)sysstderrwrite
SystemExit)statusargsmsg r@   3/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/__init__.py_exitJ   s    rB   c                    s   g }|dk	rzRt |dkr,t|dkr&dndntt|ddd}|dkr\td	t| d
  W n$ tk
r   td| d Y nX t   fdd||  D S )z>
    @param verbose      -1: quiet, 0: normal, 1: verbose
    N-ZURLszutf-8ignore)encodingerrorsr   z[debug] Batch file urls: 
zERROR: batch file z could not be readc                    s.   g | ]&}t |tr"|  d n| qS rE   )
isinstancebytesstripdecode.0urlZ_encr@   rA   
<listcomp>_   s   zget_urls.<locals>.<listcomp>)	r-   r.   openr$   r4   reprOSErrorrB   r,   )urls	batchfileverboseZ
batch_urlsr@   rQ   rA   get_urlsP   s    
rY   c                    s  d}| j rddlm} t|d}t| jD ]|}||j| sBdnd d 7 }||krjdd |	 D }n&t
t|j| }|t|d	 |dd
d |D 7 }q,nZ| jrd d fddt| jD }n0| jrdtddgdd t	 D }ndS t|tjd d	S )N r   )	GenericIEFz (CURRENTLY BROKEN)rH   c                 S   s   g | ]\}}|s|qS r@   r@   )rO   rP   matchedr@   r@   rA   rR   n   s      z/print_extractor_information.<locals>.<listcomp>Tc                 s   s   | ]}d | dV  qdS )z  rH   Nr@   rN   r@   r@   rA   	<genexpr>r   s     z.print_extractor_information.<locals>.<genexpr>)zcute kittenszslithering pythonszfalling catzangry poodlezpurple fishzrunning tortoisezsleeping bunnyzburping cowc                 3   s.   | ]&}|  r|jd k	r|jd  dV  qdS )F)ZmarkdownZsearch_examplesN)workingZIE_DESCdescription)rO   ieZ	_SEARCHESr@   rA   r]   u   s     
zSupported TV Providers:
{}
Zmsozmso namec                 S   s   g | ]\}}||d  gqS namer@   )rO   Zmso_idZmso_infor@   r@   rA   rR   {   s     out)list_extractorsZextractor.genericr[   dictfromkeysr
   	age_limitZIE_NAMEr^   itemstuplefilterZsuitablekeysupdatejoinZlist_extractor_descriptionsZap_list_msoformatr/   r   r4   r9   stdout)optsrV   re   r[   r`   Zmatched_urlsr@   ra   rA   print_extractor_informationd   s0    
rs   c                    s   fdd d fdd	}|ddd |d	d
 |dd dj kr\jrV d nd_dj krtjtj |ddddd}|ddddd}|dkr|dkr d dj krjdd kr؈jddi n d d S )Nc                    s2   |  j krdS  j |   j d|  g dS )NF*T)compat_optsdiscardrn   rb   rr   r@   rA   _unused_compat_opt   s
    
z+set_compat_opts.<locals>._unused_compat_optTc                    sX   t |}| jkr@|d kr.t||  dS |r: |  dS n|d krTt|| d S )NTF)getattrru   setattr)Zcompat_nameopt_namedefaultremove_compatattrrx   rr   r@   rA   set_default_compat   s    

z+set_compat_opts.<locals>.set_default_compatzabort-on-errorignoreerrorsZonly_downloadzno-playlist-metafilesallow_playlist_fileszno-clean-infojsonclean_infojsonzno-attach-info-jsonFzformat-sortZmultistreamsallow_multiple_video_streams)r}   allow_multiple_audio_streamsfilenamer|   z%(title)s-%(id)s.%(ext)s)TT)	ru   embed_infojsonformat_sortextendr   Zytdl_defaultouttmplgetrn   )rr   r   Z_video_multistreams_setZ_audio_multistreams_setr@   r   rA   set_compat_opts   s&    





r   c           $   
      s@  dddd͇fdd	}fdd}d·fdd		}dd
d}t ttjjjfdkddd jd kpxjd k	ddd jd kpjd k	ddd |dj	t
d |dj |djd |djd |djd jdkr|jjdd |dj |dj |dj |dj jd krVjd kd d!d n&jd krlj_n|jjd jd k	rttjd"ddЕ^}}}|d k	o|d kod"jk d#j |||d# ||f_jD ]}|d$|tj qjd%krd _jd%kr&d _|d&jd'd(ttj t!j" |d)j#t$j% |d*jt&j" |d+jt'j% |d,j(t)j% |d-j*t+j% j,rΈj,-d.-d/_,|d0t.t/j,d1d2 fd3d4}	|	d5j0_0|	d6j1_1|	d7j2_2|	d8j3_3d9d: }
j45 D ]Z\}}|s>j4|= q$z|
|j4|< W n* t6k
rz   t7d;| d<|Y nX q$fd=d>}|d?j8_8|d@j9_9|dAj:_:|dBj;_;|dCj<_<|dDj=_=dEdF }j>5 D ]\}}||| dG qj?5 D ]&\}}|D ]}||| dH q$qj@5 D ]:\}}|D ]*\}}||| dI ||| dJ qVqJ|jAdK jB5 D ]@\}}dL|kr|d dM  dNn| dO}||| dP qj>CdQ}|dRkrd _Dj>dQ= ddSdT}|dUjE\_E_F}tG|dVjHd _HjIrd }tJdWjI}|d krjt7dXjI |KdYdZd[d\\}}}}|L }|tMkrt7d]| d^d_tNtM |d k	r|O }|tPkrt7d`| dad_tNtP ||||f_IjQd k	rtRSjQL _Qdbdc jTd k	rHjUVddg WdejT  fdfdgjU5 D _UjXd k	rztYtZ[jX W n: t\k
r } zt7dhjXdi| W 5 d }~X Y nX dj\_]_^j_L dkkr6zt`aj_ W n( t\k
r   t7dlj_ dmY nX tbj_dnkr.j__]nj__^j_L dok__tcjdje_djfd k	rntgjf_fjhd k	rtgjh_hjid k	rjjVdpji jkd k	rjjVdqjk jlrtm  _n_od }jp5 D ]f\}}|drkrqtq|}|d kr.t7dstr|d dtdQdu dv| dmn|r|dQkr|s }qjtu D ] } | dwkrTt7dm|  dxqTg g   jdykrWdzd{ d҇fd|d}	}!|!d~jvdQ|dr|rڈjvV|jvwdQ |!djxddQ	rjxwdjxdQ< jxVdg  ddtytydffdd	}"|"dddd |"dddd |"dddd |"ddddd d2 |"ddddd d2 |"ddddjzCdd |"ddddj>CdQd |"dddd |"dddUd |"dddd |"dddd |"ddddj{	oj|d |"dd |"dd |"dd |"dd |"dd |"dd |"ddj}dkdod |"dd |"dUdg d2 |"dd |"dd |"ddtm d2 |"dd dӇ fdd	}#|#j{dd |#j~ dd j
rtjntjj_j
rjjzd< jr
dÈj>dQ< jrd_js(jnr:jd kr:d_jr\js\jd kr\dĈ_jrjd krjsjrjsjrd_jrjsjsd_jrΈjd krdň_jd k	rjd krtdơ_jd k	rjd krtdǡ_dȈjkr8Wdɡ ddd˄t_ fS )Nc                 S   s"   | rdS t |pdj||dd S )NTzinvalid {name} "{value}" givenrc   value)
ValueErrorrp   )Zcndnrc   r   r?   r@   r@   rA   validate   s    z"validate_options.<locals>.validatec                    s    |d kp||k| ||S r8   r@   )rc   r   rj   r?   r   r@   rA   validate_in   s    z%validate_options.<locals>.validate_inc                    s    |d kpt ||| |S r8   )rematch)rc   r   regexr   r@   rA   validate_regex   s    z(validate_options.<locals>.validate_regexFc                    s4    |d kp|dkp| o|dk| |d|r,dnd S )Nr   z!{name} "{value}" must be positiverZ   z or 0r@   )rc   r   strictr   r@   rA   validate_positive   s
      z+validate_options.<locals>.validate_positivec              	   S   sZ   |d ks| d ks|| krd S |s6d| d|  }}t | d| d| d|  dd S )Nzmin zmax  "z+" must be must be greater than or equal to ")r   )Zmin_valZmax_valZmin_nameZmax_namer@   r@   rA   validate_minmax   s
    z)validate_options.<locals>.validate_minmaxr   z.netrczJ{name}, netrc command and username/password are mutually exclusive options)r?   zaccount usernamez{name} missingzTV Provider account usernamezTV ProviderzWUnsupported {name} "{value}", use --ap-list-mso to get a list of supported TV Providerszautonumber startzautonumber sizeTzconcurrent fragmentszplaylist startrD   zplaylist endzsubtitles sleep intervalzrequests sleep intervalzsleep intervalzmax sleep intervalzmin sleep intervalz2{name} must be specified; use --min-sleep-intervalrC   ztime range to wait for videozformat sortingnonezmerge output formatz({0})(/({0}))*|zaudio formatzsubtitle formatzthumbnail formatzrecode video formatzremux video formatkKzaudio qualityr   )r|   c              	      sV   |d krd S |dkrt dS z
t|W S  ttfk
rP    d|  d| Y nX d S )NinfZinfiniter   Fz retry count)floatint	TypeErrorr   r   r   r@   rA   parse_retries  s    
z'validate_options.<locals>.parse_retriesdownloadfragment	extractorzfile accessc              
      s|   d}t td| d| d| d|   d^}}|dkrVfddS |s^rbnd	  fd
dS d S )Nz\d+(?:\.\d+)?z(?:(linear|exp)=)?(z)(?::(z	)?)?(?::(z))?expc                    s&   t ttpd|   t p dS )N   r   minr   n)limitstartstepr@   rA   <lambda>      z<validate_options.<locals>.parse_sleep_func.<locals>.<lambda>r   c                    s&   t ttp |   tp dS )Nr   r   r   Zdefault_stepr   r   r   r@   rA   r     r   )NN)rk   r   	fullmatchrL   groups)expr	NUMBER_REop_r@   r   rA   parse_sleep_func  s       z*validate_options.<locals>.parse_sleep_funcinvalid z retry sleep expression c                    s(   |d krd S t |} |d k	d| |S )N
rate limit)r*   )rc   r   Znumeric_limitr   r@   rA   validate_bytes'  s
    z(validate_options.<locals>.validate_bytesr   zthrottled rate limitzmin filesizezmax filesizezbuffer sizezhttp chunk sizec                 S   s,   t | }|r(td| d|  d| d S )Nr   r   z": )r7   validate_outtmplr   )tmplr?   errr@   r@   rA   r   6  s    
z*validate_options.<locals>.validate_outtmplz output templatez print templatez print to file templatez print to file filenamezSponsorBlock chapter titlez-titleiz console titlez	 progressz	 templater|   rZ   c                 S   s  dd }d}g g d  }}}|p"g D ]}|r>|dkr>d}q$n`| dsz|t| W q$ tjk
r }	 ztd|  d	| d
|	 W 5 d }	~	X Y q$X q$ttj|dd  	dD ]}
|
dkot
||
}|o||dpd||dpdg}|o|d|df}d }	d |p$d gkr0d}	nh|sFt|rFd}	nR|d  |d r\dnd9  < |d  |d rzdnd9  < |d tdkrd}	|	rtd|  d| d|	 || qq$|||fS )Nc                 S   s   | dkrt dS t| S )Nr   r   )r   r+   )xr@   r@   rA   r   O  r   z:validate_options.<locals>.parse_chapters.<locals>.<lambda>z(?x)(?:
            (?P<start_sign>-?)(?P<start>[^-]+)
        )?\s*-\s*(?:
            (?P<end_sign>-?)(?P<end>[^-]+)
        )?Fz	*from-urlTrt   r   z regex "z" - r   ,rC   r   0endr   Z
start_signZend_signz Must be of the form "*start-end"z#Negative timestamps are not allowedr   rD   z-infz"-inf" is not a valid endz time range "z". )
startswithappendr   compileerrorr   mapstrrL   splitr   groupanyr   )rc   r   ZadvancedZparse_timestampZTIMESTAMP_REZchaptersrangesZfrom_urlr   r   Zrange_mobjZdurZsignsr@   r@   rA   parse_chaptersN  s<    
, (z(validate_options.<locals>.parse_chaptersz--remove-chaptersz--download-sectionsz(?x)
            (?P<name>[^+:]+)
            (?:\s*\+\s*(?P<keyring>[^:]+))?
            (?:\s*:\s*(?!:)(?P<profile>.+?))?
            (?:\s*::\s*(?P<container>.+))?
        z(invalid cookies from browser arguments: rc   keyringprofile	containerz,unsupported browser specified for cookies: "z". Supported browsers are: z, z,unsupported keyring specified for cookies: "z". Supported keyrings are: c                 3   s   t  tr`dt  }zt g}W q tk
r\ } zt| d| W 5 d }~X Y qX n*dt  } fdd d dD }|D ]N}ztj	|  W n4 tk
r } zt| d| W 5 d }~X Y nX |V  qd S )Nz--parse-metadata z is invalid; z--replace-in-metadata c                 3   s&   | ]}t jj|f d d V  qdS )r   N)r   ZActionsZREPLACE)rO   r   fr@   rA   r]     s     zCvalidate_options.<locals>.metadataparser_actions.<locals>.<genexpr>r   r   )
rJ   r   r1   r   Z	to_action	Exceptionr   r   r   Zvalidate_action)r   cmdactionsr   actionr@   r   rA   metadataparser_actions  s    
&$z0validate_options.<locals>.metadataparser_actionspre_processztitle:c                    s&   i | ]\}}|t tjt | qS r@   )list	itertoolschainr   )rO   r   v)r   r@   rA   
<dictcomp>  s    z$validate_options.<locals>.<dictcomp>zInvalid playlist-items z: )NN)r|   neverzUnsupported --xff "r   r   r   
User-AgentZRefererZnativezNo such z%s rI   zexternal downloader ")alwaysautozauto-ttyno_colorzno_color-ttyr   z" is not a valid color policybestz.
         )zO"-f best" selects the best pre-merged format which is often not the best optionzdTo let yt-dlp download and merge the best available formats, simply do not pass any format selectionztIf you know what you are doing and want only the best pre-merged format, use "-f b" instead to suppress this warningc                    s<   ||kr8||kr8  |   d|p,d|  d  dS dS )NzI arguments given without specifying name. The arguments will be given to zall sTF)r   title)rc   r   key1key2where)warningsr@   rA   report_args_compat  s    $z,validate_options.<locals>.report_args_compatzexternal downloader)r   zpost-processorzdefault-compat	sponskrubz--allow-unplayable-formatsallow_unplayable_formatsc                    sV   |t krt |}|sd S |t kr,t |}|rF|  d| d t || d S )Nz is ignored since z
 was given)r   ry   r   rz   )Zarg1opt1Zarg2opt2val1val2r|   )rr   r   r@   rA   report_conflict  s    

z)validate_options.<locals>.report_conflictz--playlist-reverseplaylist_reversez--playlist-randomplaylist_randomz--lazy-playlistlazy_playlistz--dateafter	dateafterz--datedatez--datebefore
datebeforez--exec-before-downloadexec_before_dl_cmdz"--exec before_dl:"exec_cmd	before_dl)r   z--iduseidz--outputr   z--remux-video
remuxvideoz--recode-videorecodevideoz--sponskrubremove_chaptersz--sponsorblock-marksponsorblock_markz--sponsorblock-removesponsorblock_removez--sponskrub-cutsponskrub_cutz--split-chaptersplit_chapters)r   z--embed-metadataaddmetadataz--embed-chaptersaddchaptersz--embed-info-jsonr   z--embed-subsembedsubtitlesz--embed-thumbnailembedthumbnailz--extract-audioextractaudioz--fixupfixup)Nr   rE   )r   r|   z--xattrsxattrsc                    s0   | sd S   |r | d| dn| d d S )Nz; is deprecated and may be removed in a future version. Use z insteadz+ is deprecated and may not work as expected)r   )valoldnew)deprecation_warningsr@   rA   report_deprecation'  s    z,validate_options.<locals>.report_deprecationz,--sponsorblock-mark or --sponsorblock-removez--prefer-avconvZffmpegz%(id)s.%(ext)szbestaudio/bestZ	if_existsz*Type account password and press [Return]: z6Type TV provider account password and press [Return]: zallow-unsafe-extzNUsing allow-unsafe-ext opens you up to potential attacks. Use with great care!c                 S   s   | S r8   r@   )r   prependr@   r@   rA   r   `  r   z"validate_options.<locals>.<lambda>)NN)N)F)N)N)F)NN)N)F)sumr   boolusenetrc	netrc_cmdusernamepasswordap_passwordap_usernameap_msor   autonumber_startautonumber_sizeconcurrent_fragment_downloadsplayliststartplaylistendsleep_interval_subtitlessleep_interval_requestssleep_intervalmax_sleep_intervalwait_for_videor+   r   r   r   r   convertsubtitlesconvertthumbnailsmerge_output_formatrp   ro   r   escaper   SUPPORTED_EXTSaudioformatr   Z	FORMAT_REr   r   r  r   r   r   audioqualityrL   r'   r%   retriesfragment_retriesextractor_retriesfile_access_retriesretry_sleeprj   AttributeErrorr   	ratelimitthrottledratelimitmin_filesizemax_filesize
buffersizehttp_chunk_sizer   
forceprintprint_to_filesponsorblock_chapter_titleprogress_templater   skip_downloadr  remove_rangesr#   download_rangescookiesfrombrowserr   r   lowerr   sortedupperr   impersonater   Zfrom_strZmetafromtitleparse_metadata
setdefaultr   playlist_itemsrk   r    Zparse_playlist_itemsr   geo_bypass_countrygeo_bypass_ip_block
geo_bypassr   Zrandom_ipv4lenr)   match_filterZbreaking_match_filterdownload_archiver$   ffmpeg_location
user_agentheadersZrefererZno_sponsorblocksetr  r  external_downloaderr	   r&   Zget_basenamecolorvaluesexternal_downloader_argspoppostprocessor_argsr   r   r   r  r  prefer_ffmpegr   r   dayr   r   r   r   
overwritescontinue_dlr  r  r  	keepvideogetcommentswriteinfojsonr   dumpjson
print_jsondump_single_jsonallsubtitlesr	  writeautomaticsubwritesubtitlesgetpassru   r6   Zsanitize_extension)$rr   r   r   r   r   Zmin_waitZmax_waitr   r   r   r   keyr   r   r   r   r   type_Z	tmpl_listfileZouttmpl_defaultr   r   r   Zbrowser_namer   r   r   Zdefault_downloaderprotopathZedpolicyr   r   r  r@   )r  r   rr   r   r   rA   validate_options   s   

  
 
  


&

)




(




     











$
rm  c                 c   s  | j E d H  | j D ]\}}d||dV  q| j| jB }|rPd|| jddV  | jrfd| jddV  | jr|d	| jddV  | jrd
| j	| j
| jdV  | jrd| jdV  | jrd| jdV  | jrd| jk}d| jo|dV  | js|rd| _| js|rd| j| j| j| j| jdV  | js4| js4| jrJd| j| j| jdV  | jdk	rzd| j| j| j| j| jd kddV  | jrd| jdV  | jsd| _d| j d< | j!rd| jdV  | j"rd d!iV  | j#d"krd#| j#d$kd%d&V  | j$ D ]\}}d'||d(V  qd S ))NZMetadataParser)rg  r   whenZSponsorBlockZafter_filter)rg  
categoriesapirn  ZFFmpegSubtitlesConvertorr   )rg  rp   rn  ZFFmpegThumbnailsConvertorZFFmpegExtractAudio)rg  ZpreferredcodecZpreferredqualitynopostoverwritesZFFmpegVideoRemuxer)rg  ZpreferedformatZFFmpegVideoConvertorzno-keep-subsZFFmpegEmbedSubtitle)rg  Zalready_have_subtitleTZModifyChapters)rg  Zremove_chapters_patternsZremove_sponsor_segmentsr?  r<  force_keyframesZFFmpegMetadata)rg  Zadd_chaptersZadd_metadataZadd_infojsonFZ	SponSkrub)rg  rk  r>   ZcutforceZignoreerrorZ	_from_cliZEmbedThumbnail)rg  Zalready_have_thumbnailrZ   Zpl_thumbnailZFFmpegSplitChapters)rg  rr  rg  ZXAttrMetadatar   FFmpegConcatr   playlistrg  Zonly_multi_videorn  ZExec)rg  r   rn  )%Zadd_postprocessorsrF  rj   r  r  Zsponsorblock_apir'  r(  r  r,  r-  rq  r   r  r	  ru   re  rd  r  r?  r<  force_keyframes_at_cutsr  r  r   r   Zsponskrub_pathZsponskrub_argsr  Zsponskrub_forcer
  writethumbnailr   r  r  Zconcat_playlistr   )rr   rn  r   Zsponsorblock_queryZ	keep_subsr   r@   r@   rA   get_postprocessorse  s    


	

ry  ParsedOptions)parseroptionsrV   ydl_optsc                    s  t | \} }t| j jr& js&dn j}t  zt \}}W n2 tk
rx } z|| d W 5 d}~X Y nX t	t
 }t jot fddtdd D }t fdddD } jdkr|p jpt j _d	d
 |D }	 jo j o jo jddk}
t j j jd jd|
fsl|	sRd _n|	ddddgkrld _ jtjkr jn2 jtjkr jn jr jt jkr jnd}t!| | j" j# j$ j% j& j' j( j) j* j+ j, j- j. j j/ j0 j1 j2 j3 j4 j5 j6 j7 j j j8p, j j j9 j:dkrP|pT|pTdn j: j; j< j= j> j? j@ jA jB jC jD jE j jF jG jH jI jJ jK jL jM jNpdg jO jP jQ jR jS jT jU jV jW jX jY jZ j[ j\ j] j^dkr jn j^ j_ j` ja jb jc jd je jf jg jddk jh ji jj jk jl j j j jm jndk jndk jo jp jq jr js jt ju jv jw jxty jzty j{ j| j} j~ j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j|| j j j j j j j j j j j j j j j j j j j j j j j j j j j|| jdS )z4@returns ParsedOptions(parser, opts, urls, ydl_opts)rD   rH   Nc                 3   s   | ]}| j kV  qd S r8   )r:  rO   r   rw   r@   rA   r]     s     z parse_options.<locals>.<genexpr>r   c                 3   s   | ]}t  |V  qd S r8   )ry   r~  rw   r@   rA   r]     s     )
r`  rb  getdescriptiongetdurationgetfilename	getformatgetidgetthumbnailgettitlegeturlc                 S   s   g | ]}| d dkr|qS )rn  ru  )r   )rO   ppr@   r@   rA   rR     s      z!parse_options.<locals>.<listcomp>Zpl_infojsonrZ   ru  rv   rt  Trv  Zdiscard_in_playlistr|   rC   all)r  netrc_locationr  r  r  	twofactorvideopasswordr  r  r  client_certificateclient_certificate_keyclient_certificate_passwordquietno_warningsZforceurlZ
forcetitleZforceidZforcethumbnailZforcedescriptionZforcedurationZforcefilenameZforceformatr:  r;  Z	forcejsonrb  force_write_download_archivesimulater>  rp   r   ignore_no_formats_errorr   format_sort_forcer   r   check_formatslistformatslistformats_tabler   outtmpl_na_placeholderpathsr  r  restrictfilenameswindowsfilenamesr   force_generic_extractorallowed_extractorsr4  r5  r[  r.  r1  r/  r0  Zretry_sleep_functionsskip_unavailable_fragmentskeep_fragmentsr  r8  noresizebufferr9  Z
continuedl
noprogressprogress_with_newliner=  progress_deltar   r!  ZplaylistreverseZplaylistrandomr   
noplaylistZlogtostderrconsoletitlenopart
updatetimewritedescriptionwriteannotationsr_  r   r   r^  rx  Zwrite_all_thumbnails	writelinkwriteurllinkwritewebloclinkwritedesktoplinkre  rd  rc  listsubtitlessubtitlesformatsubtitleslangs
matchtitlerejecttitlemax_downloadsprefer_free_formatstrim_file_namerX   dump_intermediate_pageswrite_pages
load_pagestestr]  r6  r7  	min_views	max_viewsZ	daterangecachediryoutube_print_sig_coderi   rN  break_on_existingbreak_on_rejectbreak_per_urlskip_playlist_after_errors
cookiefilerA  ZlegacyserverconnectZnocheckcertificateprefer_insecureenable_file_urlsZhttp_headersproxysocket_timeoutbidi_workarounddebug_printtrafficrY  include_adsdefault_searchdynamic_mpdextractor_argsyoutube_include_dash_manifestyoutube_include_hls_manifestrF   extract_flatlive_from_startr&  mark_watchedr)  	final_extpostprocessorsr  source_addressrE  	call_homer#  r$  r%  r"  rS  r@  rw  list_thumbnailsrH  xattr_set_filesizerM  rT  rO  hls_prefer_nativehls_use_mpegtshls_split_discontinuityrV  rX  cn_verification_proxygeo_verification_proxyrK  rI  rJ  	_warningsZ_deprecation_warningsru   )r   rY   rW   r  rX   r   rm  r   r   r   ry  r  r:  r  r   r   ra  r_  r   r   r   r   r  rb  r;  r  r   r+  r   r   r  r,  r   rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r`  r  r  r>  rp   r   r  r   r  r   r   r  r  r  r  r  r  r  r  r  r   r  r  r4  r5  r[  r.  r1  r/  r0  r2  r  r  r  r8  r  r9  r\  r  r  r=  r  r   r!  r   r   r   r  r  r  r  r  r  r^  rx  r  r  r  r  re  rd  rc  r  r  r  r"   r  r  r  r  r  r  r  r  r  r]  r6  r7  r  r  r   r  r  ri   rN  r  r  r  r  r  rA  Zlegacy_server_connectZno_check_certificater  r  rQ  r  r  r  r  rY  r  r  r  r  r  r  rF   r  r&  r  r)  r  r  rE  r  r#  r$  r%  r"  rS  r@  rw  r  rH  r  rM  rT  rO  r  r  r  rV  rX  r  r  rK  rI  rJ  ru   )argvr{  rV   r   r  r   r  Z
print_onlyZany_gettingZplaylist_ppsZwrite_playlist_infojsonr  r@   rw   rA   parse_options  s    "(


  r  c              
      sv  t d t| \}}}}|jt_|jrTt|jddtd d}t	| dt
jd d S t||rbd S |jrvtj|j t||jp|j}|p|j}|jrj  zHt|j}|jr| r|r|jr| W W  5 Q R  S d W n$ tk
r   t  d_Y nX |j rt!d	d
ft!dd
ft!dd
fg}	" }
dd fdd|
D }|	D ]H\ t# fdd|
D sf|$fdd  dD  qf%d &t'dddg|ddd W 5 Q R  d S |s|rjW  5 Q R  S | d krt
j(dd  n| })| |st*dkrt+t
ddrdd l,}dd l-}|.d }d|j/j0  }|1|d}t2t
d!ot3j45t
j67d"}|dks|r|dkrt8|9d# |:  t;d |<d$ |=  zV|jd k	r |rd% >t?|jW W  5 Q R  S @|W W  5 Q R  S W n, tAk
rf   %d& Y W 5 Q R  d'S X W 5 Q R X d S )(Nzyt-dlpr   F)Z	casesenser|   rH   rd   z)Restart yt-dlp to use the updated versiond   ZchromeZ	curl_cffiZedgeZsafaric                 S   s:   t | j | jddpdt | jp"d | jddp4d|gS )NrC   )delimrZ   )r(   clientr   versionos
os_version)targethandlerr@   r@   rA   make_row  s    z_real_main.<locals>.make_rowc                    s   g | ]\}} ||qS r@   r@   rO   r  r  )r  r@   rA   rR     s     z_real_main.<locals>.<listcomp>c                 3   s"   | ]\}}|ko| kV  qd S r8   r@   r  )known_handlerknown_targetr@   rA   r]     s   z_real_main.<locals>.<genexpr>c                    s   g | ]}  | jjqS r@   )Z_format_outZStylesSUPPRESS)rO   text)ydlr@   rA   rR     s   z (not available)z$[info] Available impersonate targetsZClientZOSZSourcer   rC   )Z	extra_gapr  r   ntfrozenr   Kernel32_MEIPASSZ_MEIzDo not double-click the executable, instead call it from a command line.
Please read the README for further information on how to use yt-dlp: https://github.com/yt-dlp/yt-dlp#readmezSYou must provide at least one URL.
Type yt-dlp --help to see a list of all options.z(URLs are ignored due to --load-info-jsonzAborting remaining downloadse   )Br0   r  Zplugin_dirsr   Z_plugin_dirsZdump_user_agentr2   rQ  r5   r4   r9   rq   rs   rO  r   Z_ffmpeg_locationrR  r7   Zupdate_selfZrm_cachedirZload_info_filenamecacheremover   rn   r   ZrestartZreport_warningr   	traceback	print_excZ_download_retcodeZlist_impersonate_targetsr   Z"_get_available_impersonate_targetsr   r   Z	to_screenZ	to_stdoutr/   r  Zwarn_if_short_idr   ry   Zctypes.wintypesmsvcrtZWinDLLZwintypesZDWORDZGetConsoleProcessListhasattrr  rk  basenamer  r   printZ_generate_error_messageZgetchrB   r   destroyZdownload_with_info_filer$   r   r   )r  r{  rr   Zall_urlsr}  Zuar   Z
actual_useZupdaterZknown_targetsZavailable_targetsZrowsr>   ctypesr  kernel32bufferZattached_processesZ
is_onefiler@   )r  r  r  r  rA   
_real_main  s    









 

r   c              
   C   s
  da zttt|   W n ttfk
r8   td Y n tk
rf } ztd|  W 5 d }~X Y n tk
r   td Y n tk
r } z4t	
t	jt	j}t	|tj  td|  W 5 d }~X Y n6 tjk
r } ztdd|  W 5 d }~X Y nX d S )NTr   zERROR: z
ERROR: Interrupted by userz
ERROR: r   rH   )_IN_CLIrB   r3   r   r   r   r!   KeyboardInterruptBrokenPipeErrorr  rS   devnullO_WRONLYdup2r9   rq   filenooptparseOptParseError)r  er  r@   r@   rA   main?  s    r  )gen_extractorsrf   r7   r  rf   )r   )N)N)N)Yr9   version_infoImportError__license__collectionsrf  r   r  r  r   r  compatr   cookiesr   r   r   Zdownloader.externalr	   r   r
   Zextractor.adobepassr   Znetworking.impersonater   r|  r   Zpostprocessorr   r   r   r   r   r   r   r   r   rn   r   utilsr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   Zutils.networkingr5   Zutils._utilsr6   r7   r  rB   rY   rs   r   rm  ry  
namedtuplerz  r  r   r  r  rf   __all__r@   r@   r@   rA   <module>   s^   
,|
+   ;
 `
y
