U
    Mfл                     @   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 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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZF ddlGmGZG daHd,ddZIdd ZJdd ZKdd ZLdd ZMdd ZNeOd d!ZPd-d"d#ZQd.d$d%ZRd/d&d'ZSdd(lmTZTmUZU d'd)d#d*d+gZVd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)get_external_downloader)list_extractor_classes)MSO_INFO)ImpersonateTarget)	parseOpts)	FFmpegExtractAudioPPFFmpegMergerPPFFmpegPostProcessorFFmpegSubtitlesConvertorPPFFmpegThumbnailsConvertorPPFFmpegVideoConvertorPPFFmpegVideoRemuxerPPMetadataFromFieldPPMetadataParserPP)Updater)
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-zk9bgjdq/yt_dlp/__init__.py_exitI   s    r@   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 rC   )
isinstancebytesstripdecode.0urlZ_encr>   r?   
<listcomp>^   s   zget_urls.<locals>.<listcomp>)	r+   r,   openr"   r2   reprOSErrorr@   r*   )urls	batchfileverboseZ
batch_urlsr>   rO   r?   get_urlsO   s    
rW   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)rF   c                 S   s   g | ]\}}|s|qS r>   r>   )rM   rN   matchedr>   r>   r?   rP   m   s      z/print_extractor_information.<locals>.<listcomp>Tc                 s   s   | ]}d | dV  qdS )z  rF   Nr>   rL   r>   r>   r?   	<genexpr>q   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)rM   ieZ	_SEARCHESr>   r?   r[   t   s     
zSupported TV Providers:
{}
Zmsozmso namec                 S   s   g | ]\}}||d  gqS namer>   )rM   Zmso_idZmso_infor>   r>   r?   rP   z   s     out)list_extractorsZextractor.genericrY   dictfromkeysr	   	age_limitZIE_NAMEr\   itemstuplefilterZsuitablekeysupdatejoinZlist_extractor_descriptionsZap_list_msoformatr-   r
   r2   r7   stdout)optsrT   rc   rY   r^   Zmatched_urlsr>   r_   r?   print_extractor_informationc   s0    
rq   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discardrl   r`   rp   r>   r?   _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)getattrrs   setattr)Zcompat_nameopt_namedefaultremove_compatattrrv   rp   r>   r?   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filenamerz   z%(title)s-%(id)s.%(ext)s)TT)	rs   embed_infojsonformat_sortextendr   Zytdl_defaultouttmplgetrl   )rp   r~   Z_video_multistreams_setZ_audio_multistreams_setr>   r}   r?   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|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._,|d/t.t/j,d0d1 fd2d3}	|	d4j0_0|	d5j1_1|	d6j2_2|	d7j3_3d8d9 }
j45 D ]Z\}}|sj4|= q z|
|j4|< W n* t6k
rV   t7d:| d;|Y nX q fd<d=}|d>j8_8|d?j9_9|d@j:_:|dAj;_;|dBj<_<|dCj=_=dDdE }j>5 D ]\}}||| dF qΈj?5 D ]&\}}|D ]}||| dG q qj@5 D ]:\}}|D ]*\}}||| dH ||| dI q2q&|jAdJ jB5 D ]@\}}dK|kr|d dL  dMn| dN}||| dO qxj>CdP}|dQkrd _Dj>dP= ddRdS}|dTjE\_E_F}tG|dUjHd _HjIrd }tJdVjI}|d krFt7dWjI |KdXdYdZd[\}}}}|L }|tMkrt7d\| d]d^tNtM |d k	r|O }|tPkrt7d_| d`d^tNtP ||||f_IjQd k	rtRSjQL _Qdadb jTd k	r$jUVdcg WddjT  fdedfjU5 D _UjXd k	rztYtZ[jX W n: t\k
r } zt7dgjXdh| W 5 d }~X Y nX di\_]_^j_L djkrzt`aj_ W n( t\k
r   t7dkj_ dlY nX tbj_dmkr
j__]nj__^j_L dnk__tcjdje_djfd k	rJtgjf_fjhd k	rbtgjh_hjid k	r~jjVdoji jkd k	rjjVdpjk jlrtm  _n_od }jp5 D ]f\}}|dqkrԐqtq|}|d kr
t7drtr|d dsdPdt du| dln|r|dPkr|s }qjtu D ] } | dvkr0t7dl|  dwq0g g   jdxkrxWdydz dчfd{d|	}!|!d}jvdP|d~r|rjvV|jvwdP |!djxddPrjxwdjxdP< jxVdg  ddtytydffdd	}"|"dddd |"dddd |"dddd |"ddddd d1 |"ddddd d1 |"ddddjzCdd |"ddddj>CdPd |"dddd |"dddTd |"dddd |"dddd |"ddddj{	o҈j|d |"dd |"dd |"dd |"dd |"dd |"dd |"ddj}dkdnd |"dd |"dTdg d1 |"dd |"dd |"ddtm d1 |"dd d҇ fdd	}#|#j{dd |#j~ dd j
rtjntjj_j
rԈjjzd< j
rdj>dP< j
rd_jsjnrjd krd_jr8js8jd kr8dÈ_jrrjd krrjsrjrljsljrrd_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rtdơ_dǈjkrWdȡ dddʄt_ fS )Nc                 S   s"   | rdS t |pdj||dd S )NTzinvalid {name} "{value}" givenra   value)
ValueErrorrn   )Zcndnra   r   r=   r>   r>   r?   validate   s    z"validate_options.<locals>.validatec                    s    |d kp||k| ||S r6   r>   )ra   r   rh   r=   r   r>   r?   validate_in   s    z%validate_options.<locals>.validate_inc                    s    |d kpt ||| |S r6   )rematch)ra   r   regexr   r>   r?   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 positiverX   z or 0r>   )ra   r   strictr   r>   r?   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>   r?   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 startrB   zplaylist endzsubtitles sleep intervalzrequests sleep intervalzsleep intervalzmax sleep intervalzmin sleep intervalz2{name} must be specified; use --min-sleep-intervalrA   ztime range to wait for videozformat sortingzmerge output formatz({0})(/({0}))*|zaudio formatzsubtitle formatzthumbnail formatzrecode video formatzremux video formatkKzaudio qualityr   )rz   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>   r?   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>   r?   <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>   r?   r     r   )NN)ri   r   	fullmatchrJ   groups)expr	NUMBER_REop_r>   r   r?   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(   )ra   r   Znumeric_limitr   r>   r?   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": )r5   validate_outtmplr   )tmplr=   errr>   r>   r?   r   0  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	 templaterz   rX   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>   r?   r   I  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-urlTrr   r   z regex "z" - r   ,rA   r   0endr   Z
start_signZend_signz Must be of the form "*start-end"z#Negative timestamps are not allowedr   rB   z-infz"-inf" is not a valid endz time range "z". )
startswithappendr   compileerrorr   mapstrrJ   splitr   groupanyr   )ra   r   ZadvancedZparse_timestampZTIMESTAMP_REZchaptersrangesZfrom_urlr   r   Zrange_mobjZdurZsignsr>   r>   r?   parse_chaptersH  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: ra   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)rM   r   fr>   r?   r[     s     zCvalidate_options.<locals>.metadataparser_actions.<locals>.<genexpr>r   r   )
rH   r   r/   r   Z	to_action	Exceptionr   r   r   Zvalidate_action)r   cmdactionsr   actionr>   r   r?   metadataparser_actions  s    
&$z0validate_options.<locals>.metadataparser_actionspre_processztitle:c                    s&   i | ]\}}|t tjt | qS r>   )list	itertoolschainr   )rM   r   v)r   r>   r?   
<dictcomp>  s    z$validate_options.<locals>.<dictcomp>zInvalid playlist-items z: )NN)rz   neverzUnsupported --xff "r   r   r   
User-AgentZRefererZnativezNo such z%s rG   zexternal downloader ")alwaysautono_colorr   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)ra   r   key1key2where)warningsr>   r?   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   rw   r   rx   )Zarg1opt1Zarg2opt2val1val2rz   )rp   r   r>   r?   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   rC   )r   rz   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>   r?   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 r6   r>   )r   prependr>   r>   r?   r   Z  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   merge_output_formatrn   rm   r   escaper   SUPPORTED_EXTSaudioformatr   Z	FORMAT_REconvertsubtitlesr   convertthumbnailsr   r   r   r   r   audioqualityrJ   r%   r#   retriesfragment_retriesextractor_retriesfile_access_retriesretry_sleeprh   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_itemsri   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getpassrs   r4   Zsanitize_extension)$rp   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   rp   r   r   r?   validate_options   s   

  
 
  


&

)




(




     











$
rj  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)rd  r   whenZSponsorBlockZafter_filter)rd  
categoriesapirk  ZFFmpegSubtitlesConvertorr   )rd  rn   rk  ZFFmpegThumbnailsConvertorZFFmpegExtractAudio)rd  ZpreferredcodecZpreferredqualitynopostoverwritesZFFmpegVideoRemuxer)rd  ZpreferedformatZFFmpegVideoConvertorzno-keep-subsZFFmpegEmbedSubtitle)rd  Zalready_have_subtitleTZModifyChapters)rd  Zremove_chapters_patternsZremove_sponsor_segmentsr<  r9  force_keyframesZFFmpegMetadata)rd  Zadd_chaptersZadd_metadataZadd_infojsonFZ	SponSkrub)rd  rh  r<   ZcutforceZignoreerrorZ	_from_cliZEmbedThumbnail)rd  Zalready_have_thumbnailrX   Zpl_thumbnailZFFmpegSplitChapters)rd  ro  rd  ZXAttrMetadatar   FFmpegConcatr   playlistrd  Zonly_multi_videork  ZExec)rd  r   rk  )%Zadd_postprocessorsrC  rh   r   r  Zsponsorblock_apir(  r)  r  r'  r*  rn  r   r   r  rs   rb  ra  r   r<  r9  force_keyframes_at_cutsr  r  r   r   Zsponskrub_pathZsponskrub_argsr  Zsponskrub_forcer  writethumbnailr   r  r
  Zconcat_playlistr   )rp   rk  r   Zsponsorblock_queryZ	keep_subsr   r>   r>   r?   get_postprocessors_  s    


	

rv  ParsedOptions)parseroptionsrT   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)rB   rF   Nc                 3   s   | ]}| j kV  qd S r6   )r7  rM   r   ru   r>   r?   r[     s     z parse_options.<locals>.<genexpr>r   c                 3   s   | ]}t  |V  qd S r6   )rw   r{  ru   r>   r?   r[     s     )
r]  r_  getdescriptiongetdurationgetfilename	getformatgetidgetthumbnailgettitlegeturlc                 S   s   g | ]}| d dkr|qS )rk  rr  )r   )rM   ppr>   r>   r?   rP     s      z!parse_options.<locals>.<listcomp>Zpl_infojsonrX   rr  rt   rq  Trs  Zdiscard_in_playlistrz   rA   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forceformatr7  r8  Z	forcejsonr_  force_write_download_archivesimulater;  rn   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_extractorsr1  r2  rX  r+  r.  r,  r-  Zretry_sleep_functionsskip_unavailable_fragmentskeep_fragmentsr  r5  noresizebufferr6  Z
continuedl
noprogressprogress_with_newliner:  progress_deltar  r  ZplaylistreverseZplaylistrandomr   
noplaylistZlogtostderrconsoletitlenopart
updatetimewritedescriptionwriteannotationsr\  r   r   r[  ru  Zwrite_all_thumbnails	writelinkwriteurllinkwritewebloclinkwritedesktoplinkrb  ra  r`  listsubtitlessubtitlesformatsubtitleslangs
matchtitlerejecttitlemax_downloadsprefer_free_formatstrim_file_namerV   dump_intermediate_pageswrite_pages
load_pagestestrZ  r3  r4  	min_views	max_viewsZ	daterangecachediryoutube_print_sig_coderg   rK  break_on_existingbreak_on_rejectbreak_per_urlskip_playlist_after_errors
cookiefiler>  ZlegacyserverconnectZnocheckcertificateprefer_insecureenable_file_urlsZhttp_headersproxysocket_timeoutbidi_workarounddebug_printtrafficrV  include_adsdefault_searchdynamic_mpdextractor_argsyoutube_include_dash_manifestyoutube_include_hls_manifestrD   extract_flatlive_from_startr#  mark_watchedr$  	final_extpostprocessorsr	  source_addressrB  	call_homer   r!  r"  r  rP  r=  rt  list_thumbnailsrE  xattr_set_filesizerJ  rQ  rL  hls_prefer_nativehls_use_mpegtshls_split_discontinuityrS  rU  cn_verification_proxygeo_verification_proxyrH  rF  rG  	_warningsZ_deprecation_warningsrs   )r   rW   rU   r  rV   r   rj  r   r   r   rv  r  r7  r  r   r   r^  r\  r   r   r   r   r  r_  r8  r   r   r&  r   r   r  r'  r   rw  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;  rn   r   r  r   r  r   r   r  r  r  r  r  r  r  r  r  r   r  r  r1  r2  rX  r+  r.  r,  r-  r/  r  r  r  r5  r  r6  rY  r  r  r:  r  r  r  r   r   r   r  r  r  r  r  r  r[  ru  r  r  r  r  rb  ra  r`  r  r  r  r    r  r  r  r  r  r  r  r  r  rZ  r3  r4  r  r  r   r  r  rg   rK  r  r  r  r  r  r>  Zlegacy_server_connectZno_check_certificater  r  rN  r  r  r  r  rV  r  r  r  r  r  r  rD   r  r#  r  r$  r	  r  rB  r  r   r!  r"  r  rP  r=  rt  r  rE  r  rJ  rQ  rL  r  r  r  rS  rU  r  r  rH  rF  rG  rs   )argvrx  rT   r   r  r   r  Z
print_onlyZany_gettingZplaylist_ppsZwrite_playlist_infojsonr  r>   ru   r?   parse_options  s    "(


  r  c              
      sn  t d t| \}}}}|jrLt|jddtd d}t| dtjd d S t	||rZd S |j
rnt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 s^|!fdd  dD  q^"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,j-  }|.|d}t/td!ot0j12tj34d"}|dks|r|dkrt5|6d# |7  t8d |9d$ |:  zV|jd k	r|rd% ;t<|jW W  5 Q R  S =|W W  5 Q R  S W n, t>k
r^   "d& Y W 5 Q R  d'S X W 5 Q R X d S )(Nzyt-dlpr   F)Z	casesenserz   rF   rb   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 )NrA   )delimrX   )r&   clientr   versionos
os_version)targethandlerr>   r>   r?   make_row  s    z_real_main.<locals>.make_rowc                    s   g | ]\}} ||qS r>   r>   rM   r  r  )r  r>   r?   rP     s     z_real_main.<locals>.<listcomp>c                 3   s"   | ]\}}|ko| kV  qd S r6   r>   r  )known_handlerknown_targetr>   r?   r[     s   z_real_main.<locals>.<genexpr>c                    s   g | ]}  | jjqS r>   )Z_format_outZStylesSUPPRESS)rM   text)ydlr>   r?   rP     s   z (not available)z$[info] Available impersonate targetsZClientZOSZSourcer   rA   )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   )?r.   r  Zdump_user_agentr0   rN  r3   r2   r7   ro   rq   rL  r   Z_ffmpeg_locationrO  r5   Zupdate_selfZrm_cachedirZload_info_filenamecacheremover   rl   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   rw   Zctypes.wintypesmsvcrtZWinDLLZwintypesZDWORDZGetConsoleProcessListhasattrr  rh  basenamer  r   printZ_generate_error_messageZgetchr@   r   destroyZdownload_with_info_filer"   r   r   )r  rx  rp   Zall_urlsrz  Zuar   Z
actual_useZupdaterZknown_targetsZavailable_targetsZrowsr<   ctypesr  kernel32bufferZattached_processesZ
is_onefiler>   )r  r  r  r  r?   
_real_main  s    









 

r  c              
   C   s  da zttt|   W n tk
r4   td Y n tk
rb } 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 n4 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   rF   )_IN_CLIr@   r1   r  r   r   KeyboardInterruptBrokenPipeErrorr  rQ   devnullO_WRONLYdup2r7   ro   filenooptparseOptParseError)r  er  r>   r>   r?   main5  s    r  )gen_extractorsrd   r5   r	  rd   )r   )N)N)N)Wr7   version_infoImportError__license__collectionsrc  r   r  r  r   r  compatr   cookiesr   r   Zdownloader.externalr   r   r	   Zextractor.adobepassr
   Znetworking.impersonater   ry  r   Zpostprocessorr   r   r   r   r   r   r   r   r   rl   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.   r/   r0   r1   r2   Zutils.networkingr3   Zutils._utilsr4   r5   r  r@   rW   rq   r   rj  rv  
namedtuplerw  r  r  r  r	  rd   __all__r>   r>   r>   r?   <module>   s^   
,x
+   6
 `
u
