o
    iN                    @   s  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
Z
d dlZd dlZd dl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 ddlmZmZm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z& d	d
l'm(Z( d	dl)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@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN d	dlOmPZPmQZQmRZR dZSdZTdZUdZVdZWdZXdZYdZZG dd deZ[dS )    N   )	INNERTUBE_CLIENTS	BadgeTypeGvsPoTokenPolicyPlayerPoTokenPolicyStreamingProtocolYoutubeBaseInfoExtractor_PoTokenContext_split_innertube_clientshort_client_name)_EJS_WIKI_URL)initialize_jsc_director)JsChallengeRequestJsChallengeTypeNChallengeInputSigChallengeInput)initialize_pot_director)PoTokenContextPoTokenRequest   )	HTTPError)%
NO_DEFAULTExtractorErrorLazyListbug_reports_message
clean_htmldatetime_from_strfilesize_from_tbrfloat_or_noneformat_field	get_firstint_or_nonejoin_nonemptymimetype2ext
orderedSetparse_codecsparse_countparse_durationparse_iso8601parse_qs	qualities
remove_endremove_startsmuggle_urlstr_or_none
str_to_intstrftime_or_nonetraverse_objtry_calltry_getunescapeHTMLunified_strdateunsmuggle_url
update_urlupdate_url_queryurl_or_noneurljoinvariadic)clean_headersclean_proxiesselect_proxy__yt_dlp_client__yt_dlp_fetch_subs_po_token__yt_dlp_fetch_gvs_po_token__yt_dlp_player_token_provided__yt_dlp_innertube_context__yt_dlp_is_premium_subscriber__yt_dlp_available_at_timestampz4https://github.com/yt-dlp/yt-dlp/wiki/PO-Token-Guidec                       s$  e Zd ZdZdjdejdZddgZ	dZ
dZd	Zd
ZdZdZdZdZg di ddddddddddddgdddedd d!d"d#ed$d%d&d'd(d)d*d+d,ed-d.d/d0d1d2d3d4dd5d6ed7
d8d9d:d;d<dd=d>d?d@dAdBdCdDdEi ddddddddddddgdddedd d!d"d#ed$d%d&d'd*d+d,ed-d.dFd/d1d2d3d4dd5d6edGd8dCdHdIi ddJddKddLddddddgddMdeddNd!dOd#ed$dPd&dQd,ed-d.dRddFd/dSd2dTd4dMdUdVedGdWd/d/dXdYdZd[i dd\ddKdd]dddddd^gdd_dedd`dad/d!dbd#ed$dcd&ddd*d+d,ed-d.dd/ded2dfdgd_dhdiedj
dkd/d/dXdldmdni ddoddddpdd>ddqddrgddsdeddtdad/d!dud#ed$dvd&dwd*d+d,ed-d.dd/dxd2dydzdsd{d|edj
d}d/id~dZddi ddddddddddddgdddedddad/d!dd#ed$dd&dd*d+d,ed-d.dd/dd2dddddedj
d}d/idddi dddddddd>ddqddgdddeddd!dd#ed$dd&dd,ed-d.dRddFd/dd2dddddedGd~dCddi dddddddddddd^gdddeddd!dd$dd&dd,ed-d.dRddFdddd2dddddeddddd/ddi dddddddddddd^gdddedddad/d!dd#ed$dd&dd*d+d,ed-d.dd/dd2dddddedj
dgd}d/iddi ddddddddddddgdddedddad/d!dÓd$dēd&dœd,ed-dƓdRdǓdFd/dddd2dddddedϜ
d}d/idldi ddѓddddғddddӓddgddՓdedd֓d!dדd#ed$dؓd&dٓd,ed-d.dRddFd/ddd2ddddded	d}d/idldd/ddi ddddddddddddgdddeddd!dd$dd&dd,ed-d.dRddFd/ddd2dddddedd}d/idldi ddddddddddӓddgdddeddd!dd#ed$dd&dd,ed-dƓdRdǓdFd/dddd2dddddedϜ
dd/d/dXdld d/ddd/ddd/ddd/ddi ddddddddddddgdddedd	d!d
d#ed$dd&dd,ed-d.dRddFd/dd2dddddedGd}d/idldd/dddddddddd9dd/ddi ddddddddddddgdddedd d!d!d"d#d$d$d&d%d&d'd,ed-d.dRdd/d(d2d)d*dd+d,ed-	d}d/idld.i dd/dddd0dddddd1gdd2dedd3dad/d!d4d"dd#ed$d5d&d6d*d+d&d'ed.dd/dd2d7d8d2d9d:ed;d}d/idld<d/dd=d/dd>d?dd@dAdBdCdDdEd9dFi ddGddddHddddddgddIdeddJdad/d!dKd#ed$dLd&dMd*d+d,ed-d.dd/dd2dNdOdIdPdQedj
dRgd}d/iddSdTddUdVdWdXdYdZd9d[d/dd\d/dd]d/dd^d/dd_d/dd`d/ddad/ddbi ddcddddddddedfdgdddhdigdddd^gddideddjdad/d!dkd#edldigd$dmdnd+ed.dd/dodd2dpdddqdiedrd}d/idldsd/ddtduddvdwdxdydzd{d|d8d9d}i dd~ddddddddddgdddeddd!dd$dPd&dd,ed-d.dRddFd/dg d2dddddedd}d/idldi ddddddddddddgdddedddad/d!dd"d#d#ed$dd&dd*d+d,ed.dd/dd2dddddedd}d/idldd/ddd/ddi dddddddddeddgddhdgdddd^gdddedddad/d!dd#edldgd$ddd+ed.dd/ddd(d2ddddedd}d/idldd/ddi dddddddd>ddqdd1gdddedddad/d!dd#ed$dd&dd,ed-d.dRdd/dd2ddddded-	d~d9di ddddddddddddgdddeddd!dd$dd&dd-d.dRddFd/dddd2dddddedd}d/idldd/ddd/ddd/ddi ddēddœddƓddddddgddǓdeddȓdad/d!dɓd"d#d#ed$dʓd&d˓d*d+d,ed.dd/dd2d͐dΐdǐdϐdedddѐdgiidd/dԜdՐd֜dbd/dddؐdgiiidڜdd/ddܐdi ddޓddߓddddddddgdddedddad/d!dd"dd#ed$dd&dd*d+d,ed.dd/dd2dddddeddd/dddi ddddddddddddrgdddeddd!dd#ed$dd&dd*d+d,ed-d.dRdd/dd2ddddded-	d}d/idldi ddddddddddddgdddedddad/d!dd#ed$dd&dd*d+d,ed-d.dd/dd dd2d ddddedd}d/idldi dddddedddddd^gdddedddad/d!d	d
ed$dd,ed-ddRdǓdFd/dddd2dddddedϜ
d}d/idldi ddddddddddӓdd^gdddeddd!dd$dPd&dd,ed-d.dRddFd/dg d2dddddedd}d/idldi dd dddd!ddddӓddgdd"dd#d!d$d$dPd&d%d,ed-d.dRddFd/dg dd2d&d'd"d(d)edd}d/idld*i dd+dddd,ddddddgdd"dd#d!d$d$d-d&d%d,ed-d.dRddFd/dg dd2d.d/d"d(d)eddd0d1giid/d2d3gd4d5d6d/dd7d8i dd9dddd:ddddddgdd;dedd<dad/d!d=d#ed$d>d&d?d*d+d,ed-d.dd/g d2d@dAd;dBdCedj
ddѐdDgiidEd/dԜdFdZdGdHi ddddIdddd>ddqddgdddeddd!dd#ed$dd&dd,ed-d.dRddFd/dd2dddddedGdJd/dd~dZdKdLi ddMddddNddddddgddOdeddPdad/d!dQd"dd#ed$dRd&dSd*d+d,eddd/dTdUdd2dVdTdOdWdXedYd}d/iddZi dd[ddIdd\dddd]dedd^dad/d!d_d"dd#ed$d`d&dad*d+d,ed-d.dRdd/dSd2dbdcd]dddeed-	ddDgdfgdgid/d2dFd֜dhi ddiddddjddddddgddkdeddld!dmd$dPd&dnd,ed-d.dRddFd/dg d2dodpdkdqdredd}d/idldsi ddtddddudhdvgdwdudedxdydzd{d|dgdud$d}dRdd~dddddd!ddad/deeeedddd+d^gg ddvgddd/dd.dd}d/idldi ddddddd$ddRdd~dddddddddd!dd#eded,eddd&ddddgg dddgddd/dd.dd}d/idldi ddddddd$ddRdd~dddddddddd!dd#eded,eddd&dddd^gg g dddddd/dd.d
d}d/idldi ddddddd$dPdRdd~d"dd(dd)dd"dd#d!d$deded,eddd&d%dddgg ddddd/dd.dddd/d/ddldi ddddddd$dPdRdd~dddddddddd!dded,eddd&dddddgg ddd/dd.d)ddd/d/ddlZdi ddÓddddēdŐdƓd$dǓddddSddȓdFd/dd2d,ed#eddɓd-d.d!dʓddd&d˓edgedɐd̐dd+dddϜ	d}d/idldi ddѓddddғddddddgddӓdeddԓd!dՓd#ed$d֓d&dדd,ed-d.dRddFd/dd2dؐdِdӐdڐdedGd}d/idldi ddݓddddޓdddddd^gddߓdeddd!dd#ed$dPd&dd,ed-d.dddRdd/dd2dddߐdded-	d}d/idldi ddddddddddddgdddeddd!dd$dd&dd,ed-d.dRddFd/ddd2dddddeddddgiid/d2dldddddddd'd}d/id gZedd ZdZdZddddd	d
ddddddZdd e D Ze fddZ fddZ fddZ dd Z!dd Z"dd Z#ddd d!d"Z$dd#d$d%Z%d~d&d'Z&d(d) Z'd*d+ Z(ed,d- Z)dd.d/Z*dd0d1d2Z+dd0d3d4Z,dd5d6Z-d7d8 Z.e fd9d:Z/ed;d< Z0d=d> Z1d?d@ Z2dAdB Z3ddCdDZ4ddEdFZ5ddGdHZ6e7dIdJ Z8dKdL Z9e7dMdN Z:eddOdPZ;dQedRe<fdSdTZ=dUe<j>ddddddddf
dRe<fdVdWZ?dXdY Z@e7dZd[ ZAe7d\d] ZBd^d_ ZCd`da ZDdbdc ZEddde ZFdfdg ZGdhdi ZHddjdkZIdldm ZJdndo ZKdpdq ZLdrds ZMddtduZNdvdw ZOdxdy ZPdzd{ ZQd|d} ZR  ZSS (  	YoutubeIEYouTubea
  (?x)^
                     (
                         (?:https?://|//)                                    # http(s):// or protocol-independent URL
                         (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie|kids)?\.com|
                            (?:www\.)?deturl\.com/www\.youtube\.com|
                            (?:www\.)?pwnyoutube\.com|
                            (?:www\.)?hooktube\.com|
                            (?:www\.)?yourepeat\.com|
                            tube\.majestyc\.net|
                            {invidious}|
                            youtube\.googleapis\.com)/                        # the various hostnames, with wildcard subdomains
                         (?:.*?\#/)?                                          # handle anchor (#/) redirect urls
                         (?:                                                  # the various things that can precede the ID:
                             (?:(?:v|embed|e|shorts|live)/(?!videoseries|live_stream))  # v/ or embed/ or e/ or shorts/
                             |(?:                                             # or the v= param in all its forms
                                 (?:(?:watch|movie)(?:_popup)?(?:\.php)?/?)?  # preceding watch(_popup|.php) or nothing (like /?v=xxxx)
                                 (?:\?|\#!?)                                  # the params delimiter ? or # or #!
                                 (?:.*?[&;])??                                # any other preceding param (like /?s=tuff&v=xxxx or ?s=tuff&amp;v=V36LpHqtcDY)
                                 v=
                             )
                         ))
                         |(?:
                            youtu\.be|                                        # just youtu.be/xxxx
                            vid\.plus|                                        # or vid.plus/xxxx
                            zwearz\.com/watch|                                # or zwearz.com/watch/xxxx
                            {invidious}
                         )/
                         |(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId=
                         )
                     )?                                                       # all until now is optional -> you can pass the naked ID
                     (?P<id>[0-9A-Za-z_-]{{11}})                              # here is it! the YouTube video ID
                     (?(1).+)?                                                # if we found the ID, everything can follow
                     (?:\#|$)|)	invidiousa  (?x)
            (?:
                <(?:[0-9A-Za-z-]+?)?iframe[^>]+?src=|
                data-video-url=|
                <embed[^>]+?src=|
                embedSWF\(?:\s*|
                <object[^>]+data=|
                new\s+SWFObject\(
            )
            (["\'])
                (?P<url>(?:https?:)?//(?:www\.)?youtube(?:-nocookie)?\.com/
                (?:embed|v|p)/[0-9A-Za-z_-]{11}.*?)
            \1z(?xs)
            <a\s[^>]*\bhref="(?P<url>https://www\.youtube\.com/watch\?v=[0-9A-Za-z_-]{11})"
            \s[^>]*\bclass="[^"]*\blazy-load-youtubevideo)json3srv1srv2srv3ttmlsrtvtt)
android_vrweb
web_safari)rR   )tv_downgradedrS   rT   )rU   web_creatorrS   Fyoutubez6https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9idBaW_jenozKcextmp4titleu#   youtube-dl test video "'/\ä↭𝕐	age_limitr   availabilitypublic
categorieszScience & TechnologychannelzPhilipp Hagemeisterchannel_follower_count
channel_idUCLqxVugv74EIW3VWh2NOa3Qchannel_urlz8https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Qcomment_countdescriptionz$md5:8fb536f4877b8a7455c2ec23794dbc22duration
   end_time	   heatmapz	count:100
like_countlive_statusnot_liveTr   zcount:1zre:https?://i\.ytimg\.com/.+i!kP20121002z@PhilippHagemeisterz+https://www.youtube.com/@PhilippHagemeister)
playable_in_embed
start_timetags	thumbnail	timestampupload_dateuploaderuploader_iduploader_url
view_countzVideo unavailable)url	info_dictskipzEmbed-only video (#1746)z%//www.YouTube.com/watch?v=yZIXLfi8CZQyZIXLfi8CZQzCPrincipal Sexually Assaults A Teacher - Episode 117 - 8th June 2012   z$md5:09b78bd971f1e3e289601dfba15ca4f720120608)rX   rZ   r\   r]   rg   rv   zPrivate video)noter{   r|   r}   z!Use the first video ID in the URLz9https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQrq   )rs   rt   ru   rv   rw   rx   ry   rz   z.256k DASH audio (format 141) via DASH manifestz+https://www.youtube.com/watch?v=a9LDPn-MO4Iza9LDPn-MO4Im4azUHDTV TEST 8K VIDEO.mp48KVIDEOzUC8cn-cnCZ2FnxmjfkoLGpsQz8https://www.youtube.com/channel/UC8cn-cnCZ2FnxmjfkoLGpsQ <   
media_typezcount:8ijPz@8KVIDEOz https://www.youtube.com/@8KVIDEO141)formatskip_downloadyoutube_include_dash_manifestzformat 141 not served anymore)r   r{   r|   paramsr}   z+https://www.youtube.com/watch?v=IB3lcPjvWLAIB3lcPjvWLAzJAfrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree WilsonMusicAfrojackUChuZAo1RKL85gev3Eal9_zgchannel_is_verifiedz8https://www.youtube.com/channel/UChuZAo1RKL85gev3Eal9_zgz$md5:8f5e2b82460520b619ccac1f509d43bf   zcount:19iTWR20131011z@AfrojackVEVOz%https://www.youtube.com/@AfrojackVEVO)
r   rq   rs   rt   ru   rv   rw   rx   ry   rz   z141/bestaudio[ext=m4a])r{   r|   r   z6Embed allowed age-gated video; works with web_embeddedz'https://youtube.com/watch?v=HtVdAasjOgUHtVdAasjOgUz7The Witcher 3: Wild Hunt - The Sword Of Destiny Trailer
needs_authGamingzThe WitcherUCzybXLxv08IApdjdN0mJhEgz8https://www.youtube.com/channel/UCzybXLxv08IApdjdN0mJhEgz$md5:595a43060c51c2a8cb61dd33c18e5fbd   zcount:17iﱐS20140605z@thewitcherz#https://www.youtube.com/@thewitcherr   z'Age-restricted; requires authenticationz=Formerly an age-gated video with embed allowed in public sitez'https://youtube.com/watch?v=HsUATh_Nc2UHsUATh_Nc2UzGodzilla 2 (Official Video)EntertainmentFlyingKittyUCYQT13AtrJC0gsM1far_zJgz8https://www.youtube.com/channel/UCYQT13AtrJC0gsM1far_zJgz$md5:bf77e03fcae5529475e500129b05668a   zcount:2it^20200408z@FlyingKitty900z'https://www.youtube.com/@FlyingKitty900)r   r{   r|   r   z6Age-gated video embedable only with clientScreen=EMBEDz'https://youtube.com/watch?v=Tq92D6wQ1mgTq92D6wQ1mgz#[MMD] Adios - EVERGLOW [+Motion DL]zProjekt MelodyzUC1yoRdFoFJaCY-AGfD9W0wQz8https://www.youtube.com/channel/UC1yoRdFoFJaCY-AGfD9W0wQz$md5:17eccca93a786d51bc67646756894066j   zcount:5it^20191228z@ProjektMelodyz&https://www.youtube.com/@ProjektMelodyz"Non-age-gated non-embeddable videoz'https://youtube.com/watch?v=MeJVWBSsPAYMeJVWBSsPAYz%OOMPH! - Such Mich Find Mich (Lyrics)z
Herr LurikzUCdR3RSDPqub28LjZx0v9-aAz8https://www.youtube.com/channel/UCdR3RSDPqub28LjZx0v9-aAz$md5:205c1049102a4dffa61e4831c1f16851   rs   iQ20130730z
@HerrLurikz"https://www.youtube.com/@HerrLurik)rt   ru   rv   rw   rx   ry   rz   )r   r{   r|   zNon-bypassable age-gated videoz'https://youtube.com/watch?v=Cr381pDsSsA)r   r{   only_matching__2ABJjxzNozDeadmau5 - Some Chords (HD)deadmau5zUCYEK6xds6eo-3tr4xRdflmQz8https://www.youtube.com/channel/UCYEK6xds6eo-3tr4xRdflmQz$md5:c27e1e9e095a3d9dd99de2f0f377ba06i
  zcount:14i<K20100430z	@deadmau5z!https://www.youtube.com/@deadmau5zDASH manifest missing)r{   r|   expected_warningsr   lqQg6PlCWgIz5Hockey - Women -  GER-AUS - London 2012 Olympic GamesSportsOlympicsUCTl3QQTvqHFjurroKxexy2Qz8https://www.youtube.com/channel/UCTl3QQTvqHFjurroKxexy2Qz$md5:04bbbf3ccceb6795947572ca36f45904i  was_live
livestream20120731iDPzcount:10iZtU20150827z	@Olympicsz!https://www.youtube.com/@Olympics)
release_daterelease_timestamprs   rt   ru   rv   rw   rx   ry   rz   z+https://www.youtube.com/watch?v=_b-2C3KPAM0z_b-2C3KPAM0u8   [A-made] 變態妍字幕版 太妍 我就是這樣的人unlistedzPeople & Blogsu	   孫ᄋᄅzUCS-xxCmRaA6BFdmgDPA_BIwz8https://www.youtube.com/channel/UCS-xxCmRaA6BFdmgDPA_BIwz$md5:636f03cf211e7687daffe5bded88a94fU   gqq?zcount:11iyM20110310z
@AllenMeowz"https://www.youtube.com/@AllenMeow)	stretched_ratiors   rt   ru   rv   rw   rx   ry   rz   qEJwOuvDf7I)r{   r   z+https://www.youtube.com/watch?v=FIl7x6_3R5YFIl7x6_3R5Yuc   [60fps] 150614  마마무 솔라 'Mr. 애매모호' 라이브 직캠 @대학로 게릴라 콘서트dorappi2000UCNlmrKRHLHcd2gq6LtPOTlQz8https://www.youtube.com/channel/UCNlmrKRHLHcd2gq6LtPOTlQz$md5:116377fd2963b81ec4ce64b542173306   zcount:12iU20150626z@dorappi2000z$https://www.youtube.com/@dorappi2000z)https://www.youtube.com/embed/CsmdDsKjzN8CsmdDsKjzN8u1   Retransmisión XVIII Media maratón Zaragoza 2015zAirtek | LED streamingUCzTzUmjXxxacNnL8I3m4LnQz8https://www.youtube.com/channel/UCzTzUmjXxxacNnL8I3m4LnQz$md5:fcac84e6c545114766f670236fc10196i*  20150510i3OUzcount:31iCU20150501z@airtekledstreaming7916z/https://www.youtube.com/@airtekledstreaming7916135z+https://www.youtube.com/watch?v=zaPI8MvL8pgz+https://www.youtube.com/watch?v=gVfLd0zydlozhttps://vid.plus/FlRa-iH7PGwz_https://zwearz.com/watch/9lWxNJF-ufM/electra-woman-dyna-girl-official-trailer-grace-helbig.htmlz+https://www.youtube.com/watch?v=lsguqyKfVQglsguqyKfVQgz4{dark walk}; Loki/AC/Dishonored; collab w/Elflover21zFilm & AnimationIronSoulElfUCTSRgz5jylBvFt_S7wnsqLQz8https://www.youtube.com/channel/UCTSRgz5jylBvFt_S7wnsqLQz$md5:8085699c11dc3f597ce0410b0dcbb34a   zcount:13iNV20151119z@IronSoulElfz$https://www.youtube.com/@IronSoulElfz+https://www.youtube.com/watch?v=Ms7iBXnlUO8z+https://www.youtube.com/watch?v=Q39EVAstoRMQ39EVAstoRMz+Clash Of Clans#14 Dicas De Ataque Para CV 4z$md5:ee18a25c350637c8faff806845bddee920151107)rX   rZ   r\   rg   rv   zThis video does not exist.z+https://www.youtube.com/watch?v=FRhJzUSJbGIz+https://www.youtube.com/watch?v=M4gD1WSo5mAM4gD1WSo5mAz`William Fisher, CopyrightX: Lecture 3.2, The Subject Matter of Copyright: Drama and choreography	Educationz/The Berkman Klein Center for Internet & SocietyUCuLGmD72gJDBwmLw06X58SAz8https://www.youtube.com/channel/UCuLGmD72gJDBwmLw06X58SAchapterszcount:4z$md5:a677553cf0840649b731a3024aeff4cci  licensez4Creative Commons Attribution license (reuse allowed)zcount:3i<pT20150128z@BKCHarvardz#https://www.youtube.com/@BKCHarvard)	rq   rs   rt   ru   rv   rw   rx   ry   rz   z+https://www.youtube.com/watch?v=eQcmzGIKrzgeQcmzGIKrzgz8Democratic Socialism and Foreign Policy | Bernie SanderszNews & PoliticszBernie SandersUCH1dpzjCEiGAt8CXkryhkZgz8https://www.youtube.com/channel/UCH1dpzjCEiGAt8CXkryhkZgz$md5:13a2503d7b5904ef4b223aa101628f39i  iNV20151120z@BernieSandersz&https://www.youtube.com/@BernieSanders)rm   rn   r   rq   rs   rt   ru   rv   rw   rx   ry   rz   zKhttps://www.youtube.com/watch?feature=player_embedded&amp;amp;v=V36LpHqtcDYz+https://www.youtube.com/watch?v=i1Ko8UG-Tdoz+https://www.youtube.com/watch?v=yYr8q0y5JfguGpuVWrhIzEzPiku - Trailerz$md5:c36bd60c3fd6f1954086c083c72092eb20150811zStandard YouTube License)rX   rZ   r\   rg   rv   r   zThis video is not available.z+https://www.youtube.com/watch?v=iqKdEhx-dD4ziqKdEhx-dD4zIsolation - Mind Field (Ep 1)VsaucezUC6nSFpj9HTCZ5t-N3Rm3-HAz8https://www.youtube.com/channel/UC6nSFpj9HTCZ5t-N3Rm3-HAz$md5:f540112edec5d09fc8cc752d3d4ba3cdi%  iקX20170118z@Vsaucezhttps://www.youtube.com/@VsaucezSkipping DASH manifestz+https://www.youtube.com/watch?v=6SJNVb0GnPI6SJNVb0GnPIz Race Differences in Intelligencez$md5:5d161533167390427a1f8ee89a1fc6f1i  20140124)rX   rZ   r\   rg   rh   rv   zJThis video has been removed for violating YouTube's policy on hate speech.1t24XAntNCYzsJL6WA-aGkQz&https://invidio.us/watch?v=BaW_jenozKcz1https://redirect.invidious.io/watch?v=BaW_jenozKcz)https://redirect.invidious.io/Yh0AhrY9GjAz+https://www.youtube.com/watch?v=s7_qI6_mIXcz+https://www.youtube.com/watch?v=Z4Vy8R84T1Uz-https://music.youtube.com/watch?v=MgNrAu2pzNsMgNrAu2pzNszVoyeur Girlalbumz"it's too much love to know my dear	alt_titleartistsStephenzUC-pWHpBjdGG69N9mM2auIAAz8https://www.youtube.com/channel/UC-pWHpBjdGG69N9mM2auIAAcreatorsz$md5:7ae382a65843d6df2685993e90a8628f   20190313i\20190312)rh   rl   rm   rn   r   rq   r   rs   rt   ru   trackrv   rw   rz   z/https://www.youtubekids.com/watch?v=3b8nCWDgZ6QDJztXj2GPflDJztXj2GPfkz9Panjabi MC - Mundian To Bach Ke (The Dictator Soundtrack)z$md5:bf577a41da97918e94fa9798d922882520090125z
Panjabi MCz@Beware of the Boys (Mundian to Bach Ke) - Motivo Hi-Lectro Remixz'Beware of the Boys (Mundian To Bach Ke))rX   rZ   r\   rg   rv   artistr   r   z+https://www.youtube.com/watch?v=x41yOUIvK2kx41yOUIvK2kzIMG 3456zPets & Animalszl'Or Vert asblUCo03ZQPBW5U4UC3regpt1nwz8https://www.youtube.com/channel/UCo03ZQPBW5U4UC3regpt1nw   i?Y20170613z@ElevageOrVertz&https://www.youtube.com/@ElevageOrVertz+https://www.youtube.com/watch?v=CHqg6qOn4noCHqg6qOn4noz+Part 77   Sort a list of simple types in c#	kudvenkatUCCTVrRB5KpIiK6V2GGVsR1Qz8https://www.youtube.com/channel/UCCTVrRB5KpIiK6V2GGVsR1Qz$md5:b8746fa52e10cdbf47997903f13b20dci
  i@"R20130831z@Csharp-video-tutorialsBlogspotz7https://www.youtube.com/@Csharp-video-tutorialsBlogspot)rn   r   rq   rs   rt   ru   rv   rw   rx   ry   rz   z+https://www.youtube.com/watch?v=gVfgbahppCYz1https://www.youtube.com/watch_popup?v=63RmMXCd_bQOtqTfy26tG0zBurn Outz	Every DayzThe Cinematic OrchestraUCIzsJBIyo8hhpFm1NK0uLgwz8https://www.youtube.com/channel/UCIzsJBIyo8hhpFm1NK0uLgwz$md5:fee8b19b7ba433cc2957d1c7582067acif  20020513i  inT20141120)rh   rl   rm   rn   r   rq   r   release_yearrs   rt   ru   r   rv   rw   rz   z+https://www.youtube.com/watch?v=nGC3D_FkCmgz+https://www.youtube.com/watch?v=SZJvDhaSDncSZJvDhaSDnczESan Diego teen commits suicide after bullying over embarrassing videozCBS MorningszUC-SJ6nODDmufqBzPBwCvYvQz8https://www.youtube.com/channel/UC-SJ6nODDmufqBzPBwCvYvQz$md5:acde3a73d3f133fc97e837a9f76b53b7   i6oS20140716z@CBSMorningsz$https://www.youtube.com/@CBSMorningscBvYw8_A0vQu:   4K Ueno Okachimachi  Street  Scenes  上野御徒町歩きzTravel & EventszWalk around JapanUC3o_t8PzBmXf5S9b7GLx1Mwz8https://www.youtube.com/channel/UC3o_t8PzBmXf5S9b7GLx1Mwz$md5:ea770e474b7cd6722b4c95b833c03630i  rt   i ڷ_20201120z@walkaroundjapan7124z,https://www.youtube.com/@walkaroundjapan7124)ru   rv   rw   rx   ry   rz   WaOKSUlf4TMz-https://music.youtube.com/watch?v=XclachpHxisz+https://www.youtube.com/watch?v=wsQiKKfKxugz+https://www.youtube.com/watch?v=YOelRv7fMxYYOelRv7fMxY3gpzDIGGING A SECRET TUNNEL Part 1
colinfurzezUCp68_FLety0O-n9QU6phsgwz8https://www.youtube.com/channel/UCp68_FLety0O-n9QU6phsgwz$md5:5d5991195d599b56cd0c4148907eec50iT  zcount:6i`20210624z@colinfurzez#https://www.youtube.com/@colinfurzeplayer_clientandroid17)extractor_argsr   r   zAndroid client broken)r{   r|   r   r}   r  player_skipconfigs)r{   r   r   z*https://www.youtube.com/shorts/BGQWPY4IigYStoryboardsz+https://www.youtube.com/watch?v=5KLPxDtMqe85KLPxDtMqe8mhtmlzYour Brain is PlasticSciShowzUCZYTClx2T1of7BRZ86-8fowz8https://www.youtube.com/channel/UCZYTClx2T1of7BRZ86-8fowz$md5:89cd86034bdb5466cd87c6ba206cd2bc   iOx0S20140324z@SciShowz https://www.youtube.com/@SciShow)r   r   z+https://www.youtube.com/watch?v=2NUZ8W2llS42NUZ8W2llS4u,   The NP that test your phone performance 🙂zLeon NguyenUCRqNBSOHgilHfAczlUmlWHAz8https://www.youtube.com/channel/UCRqNBSOHgilHfAczlUmlWHAz$md5:144494b24d4f9dfacb97c1bbef5de84d   zcount:23iGa20220103z@LeonNguyenz#https://www.youtube.com/@LeonNguyenz+https://www.youtube.com/watch?v=mzZzzBU6lrMmzZzzBU6lrMz$I Met GeorgeNotFound In Real Life...QuackityUC_8NknAFiyhOUaZqHR3lq3Qz8https://www.youtube.com/channel/UC_8NknAFiyhOUaZqHR3lq3Qz$md5:42e72df3d4d5965903a2b9359c3ccd25i  iNazcount:26z	@Quackityz!https://www.youtube.com/@Quackity)r   rq   r   r   rs   rt   ru   rv   rw   rx   ry   rz   z+https://www.youtube.com/watch?v=jfKfPfyJRdkjfKfPfyJRdkz	Lofi GirlUCSJ4gkVC6NrvII8umztf0Owz8https://www.youtube.com/channel/UCSJ4gkVC6NrvII8umztf0Owconcurrent_view_countz$md5:48841fcfc1be6131d729fa7b4a7784cbis_live20220712ibbzcount:32i-ebz	@LofiGirlz!https://www.youtube.com/@LofiGirlz+https://www.youtube.com/watch?v=tjjjtzRLHvAtjjjtzRLHvAu*   ハッシュタグ無し };if window.ytcsi
LesmiscoreUCdqltm_7iv1Vs6kp6Syke5Az8https://www.youtube.com/channel/UCdqltm_7iv1Vs6kp6Syke5A   shorti:b20220323z@lesmiscorez#https://www.youtube.com/@lesmiscorez+https://www.youtube.com/watch?v=el3E4MbxRqQel3E4MbxRqQz%dlp test video 2 - primary sv no desczcole-dlp-test-acczUCiu-3thuViMebBjw_5nWYrAz8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA   iqc20220908z
@coletdjnzz"https://www.youtube.com/@coletdjnzz+https://www.youtube.com/watch?v=gHKT4uU8ZnggHKT4uU8Zngz$dlp test video title primary (en-GB)z$md5:e8c098ba19888e08554f960ffbf6f90eirb20220729langfr)r  r   z!Preferring "fr" translated fields)r{   r|   r   r   z6 channel audioz+https://www.youtube.com/watch?v=zgdo7-RRjgoz#Multiple HLS formats with same itagz+https://www.youtube.com/watch?v=kX3nB4PpJkokX3nB4PpJkoz$Last To Take Hand Off Jet, Keeps It!MrBeastUCX6OQ3DkcsbYNE6H8uQQuVAz8https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVAz$md5:42731fced13eff2c48c099fbb5c1b3a0i  iP	pc20221112z@MrBeastz https://www.youtube.com/@MrBeastiosz233-1zPO Token Requiredz,Audio formats with Dynamic Range Compressionz+https://www.youtube.com/watch?v=Tq92D6wQ1mgwebmz251-drcz5Support /live/ URL + media type for post-live contentz(https://www.youtube.com/live/qVv6vCqciTMqVv6vCqciTMu   【 #インターネット女クリスマス 】3Dで歌ってはしゃぐインターネットの女たち【月ノ美兎/名取さな】u   さなちゃんねるUCIdEIHpS0TdkqRkHL5OkLtAz8https://www.youtube.com/channel/UCIdEIHpS0TdkqRkHL5OkLtAz$md5:6aebf95cc4a1d731aebc01ad6cc9806diV  20221223ici`cz@sana_natoriz$https://www.youtube.com/@sana_natori)rn   r   rq   r   r   rs   rt   ru   rv   rw   rx   ry   rz   z+https://www.youtube.com/watch?v=wSSmNUl9SnwwSSmNUl9Snwz&The Computer Hack That Saved Apollo 14zScott ManleyzUCxzC4EngIsMrPmbm6Nxvb-Az8https://www.youtube.com/channel/UCxzC4EngIsMrPmbm6Nxvb-Az$md5:f4bed7b200404b72a394c2f97b782c02i  i9@Y20170831z@scottmanleyz$https://www.youtube.com/@scottmanleywebpage)r   r  z*https://www.youtube.com/shorts/18NGQq7p3LY18NGQq7p3LYu8   아이브 이서 장원영 리즈 삐끼삐끼 챌린지u   ㅇㅇUCC25oTm2J7ZVoi5TngOHg9gz8https://www.youtube.com/channel/UCC25oTm2J7ZVoi5TngOHg9gr   if20240822u   @으아-v1ku#   https://www.youtube.com/@으아-v1kz-https://music.youtube.com/watch?v=DbCvuSGfR3YDbCvuSGfR3YBack Around   half·aliver   Conditions Of A Punkr   20221202r   i  z$md5:bfc0e2b3cc903a608d8a85a13cb50f95rw   u   half•aliveUCYQrYophdVI3nVDPOnXyIngz8https://www.youtube.com/channel/UCYQrYophdVI3nVDPOnXyIng   z:https://i.ytimg.com/vi_webp/DbCvuSGfR3Y/maxresdefault.webp)r6  r7  r5  i}c20221201)rf   rz   rm   r]   rh   rt   rl   r`   rs   r   ru   rv   rq   r^   rn   z+https://www.youtube.com/watch?v=brhfDfLdDZ8brhfDfLdDZ8z/This is the WORST Movie Science We've Ever Seenz$md5:8afd0a3cd69ec63438fc573580436f92
Open Saucerx   z@opensaucelivery   z&https://www.youtube.com/@opensauceliveUC2EiGVmCeD79l_vZ204DUSwz8https://www.youtube.com/channel/UC2EiGVmCeD79l_vZ204DUSwrz   i  z0https://i.ytimg.com/vi/brhfDfLdDZ8/hqdefault.jpg)MoonfallzBad Sciencer=  zSauce+zThe Backyard ScientistzWilliam Osmanz	Allen PanzWilliam Osman 2ih20251003)r`   rs   r   ru   rv   rq   r^   rn   z+https://www.youtube.com/watch?v=_A9KsMbWh4E_A9KsMbWh4Eu)   【MV】薫習 - LIVE UNION【RK Music】z$md5:9b3dc2b91103f303fcc0dac8617e7938RK Musicz@RKMusic_incz$https://www.youtube.com/@RKMusic_inczUCiLhMk-gmE2zgF7KGVyqvFwz8https://www.youtube.com/channel/UCiLhMk-gmE2zgF7KGVyqvFw   z:https://i.ytimg.com/vi_webp/_A9KsMbWh4E/maxresdefault.webp)rB  HACHIu   焔魔るり CH. / Ruri Enmau   瀬戸乃ととu   水瀬 凪/MINASE Nagiii20251031)
r`   rs   r   ru   rv   r   r   rq   r^   rn   z+https://www.youtube.com/watch?v=f6HNySwZV4cf6HNySwZV4cdlptestvideo2z4https://i.ytimg.com/vi/f6HNySwZV4c/maxresdefault.jpgiUe20240308   zcount:15)r`   rs   ru   rv   r   r   rq   r^   rn   rf   comments)r   getcommentsz+https://www.youtube.com/watch?v=3dHQb2Nhma03dHQb2Nhma0u   Tɪtleabcdefgz@abcdefg-d5t2cz&https://www.youtube.com/@abcdefg-d5t2cUCayEJzV8XSSJkPdA7OAsbewz8https://www.youtube.com/channel/UCayEJzV8XSSJkPdA7OAsbew   z4https://i.ytimg.com/vi/3dHQb2Nhma0/maxresdefault.jpgiTi20251231zcount:9)rs   ru   rv   rq   r^   rn   rf   rJ  zehttp://www.improbable.com/2017/04/03/untrained-modern-youths-and-ancient-masters-in-selfie-portraits/zmsN87y-iEx0z!Feynman: Mirrors FUN TO IMAGINE 6rv   20080526z$md5:873c81d308b979f0e23ee7e620b312a3zUCCeo--lls1vna5YJABWAcVAzChristopher Sykesz8https://www.youtube.com/channel/UCCeo--lls1vna5YJABWAcVA   z6https://www.youtube.com/@ChristopherSykesDocumentariesz@ChristopherSykesDocumentariesi :H)	rz   r`   rb   rw   ry   rx   rl   ru   r   z?https://badzine.de/news/als-marc-zwiebler-taufik-hidayat-schlugbSVcWOq397gzPTAUFIK TUNJUKKAN KELASNYA !!! : Taufik Hidayat VS Marc Zwiebler Canada Open 2011zBadminton Addict IdUCfCpKOwQGUe2FUJzYNadQcQz8https://www.youtube.com/channel/UCfCpKOwQGUe2FUJzYNadQcQz$md5:2c3737da9a575f301a8380b4d60592a8i  i`20210519z@badmintonaddictid8958z.https://www.youtube.com/@badmintonaddictid8958zMhttps://lothype.com/2025-chino-hills-hs-snare-quad-features-wgi2025-drumline/lC21AX_pCfAz=2025 Chino Hills HS Snare & Quad Features! #wgi2025 #drumline
DrumlineAVUCqdfUdyiQOZMvW5PcTTYikQz8https://www.youtube.com/channel/UCqdfUdyiQOZMvW5PcTTYikQ0   locationWESTMINSTERzcount:72ig20250218z@DrumlineAVz#https://www.youtube.com/@DrumlineAVzIhttps://rabota7.ru/%D0%91%D1%83%D1%85%D0%B3%D0%B0%D0%BB%D1%82%D0%B5%D1%80DexR8_tTSsQu3   Работа бухгалтером в Москвеu:   Работа в Москве свежие вакансииUCG3qz_gefGaMiSBvmaxN5WQz8https://www.youtube.com/channel/UCG3qz_gefGaMiSBvmaxN5WQz$md5:b779d3d70af4efda26cf62b76808c0e3*   zcount:7i<1Y20170602u7   @РаботавМосквесвежиевакансииuO   https://www.youtube.com/@РаботавМосквесвежиевакансииgenericimpersonatechromezhttps://www.uca.ac.uk/z
www.uca.aczAUCA | Creative Arts Degrees UK | University for the Creative Artsz$md5:179c7a06ea1ed01b94ff5d56cb18d73bz8/media/uca-2020/hero-headers/2025-prospectus-all-2x2.jpg)rX   r\   r]   rg   rt   )r{   r|   playlist_countr   c                 C   s   | j ddgdS )Nwebpage_skipplayer_responsedefault_configuration_argself rm  S/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/youtube/_video.py_skipped_webpage_dataT  s   zYoutubeIE._skipped_webpage_dataz20514@9f4cc5e4tvzplayer_ias.vflset/en_US/base.jsz#player_ias_tcc.vflset/en_US/base.jsz#player_ias_tce.vflset/en_US/base.jszplayer_es5.vflset/en_US/base.jszplayer_es6.vflset/en_US/base.jsz#player_es6_tcc.vflset/en_US/base.jsz#player_es6_tce.vflset/en_US/base.jsz%tv-player-ias.vflset/tv-player-ias.jsz%tv-player-es6.vflset/tv-player-es6.jsz,player-plasma-ias-phone-en_US.vflset/base.jsz'house_brand_player.vflset/en_US/base.js)maintcctcees5es6es6_tcces6_tcerp  tv_es6phonehousec                 C   s   i | ]\}}||qS rm  rm  .0kvrm  rm  rn  
<dictcomp>h  s    zYoutubeIE.<dictcomp>c                    s6   ddl m} ||}|dd gd rdS t |S )Nr   )r)   listF)yt_dlp.utilsr)   getsupersuitable)clsr{   r)   qs	__class__rm  rn  r  j  s
   zYoutubeIE.suitablec                    s(   t  j|i | i | _i | _d | _d S N)r  __init___code_cache_player_cache_pot_director)rl  argskwargsr  rm  rn  r  s  s   
zYoutubeIE.__init__c                    s"   t    t| | _t| | _d S r  )r  _real_initializer   r  r   _jsc_directorrk  r  rm  rn  r  y  s   

zYoutubeIE._real_initializec              
      s   t  t dd  D   	fdd fdd} D ].}	|	d< tj|	d || o?|	 }
rL|
|	d	< d
|	d< q)t|
i |	d	< |	d= q)d S )Nc                 S   s   g | ]	}| d r|qS )is_from_startr  r|  frm  rm  rn  
<listcomp>  s    z>YoutubeIE._prepare_live_from_start_formats.<locals>.<listcomp>c                    s|   t   | kr
d S d\}}}}}}t|dtd}t|dtd}||||\}} }|dkt   d S )NrS   .videoDetailsexpected_type.microformatplayerMicroformatRendererr  )time_initial_extractr1   dict_list_formats)	format_iddelay_prs
player_urlvideo_detailsmicroformatsrn   )formatsr  rl  smuggled_datarr   r{   video_idwebpage_urlrm  rn  refetch_manifest  s   
zDYoutubeIE._prepare_live_from_start_formats.<locals>.refetch_manifestc              	      s   j ddD ]L}  | W d   n1 sw   Y  t fddD d}|s@s6 d|_n	d  t  |_q|dsH dS |d |d	 f  S dS )
zZ
            @returns (manifest_url, manifest_stream_number, is_live) or None
            FfatalNc                 3        | ]}|d   kr|V  qdS )r  Nrm  r  r  rm  rn  	<genexpr>      zOYoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feed.<locals>.<genexpr>z: Video is no longer livez*Cannot find refreshed manifest for format manifest_urlmanifest_stream_number)RetryManagernexterrorr   r  )r  r  retryr  )r  r  lockr  rl  r  r  rn  mpd_feed  s   
z<YoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feedr  r  	fragmentshttp_dash_segments_generatorprotocolr  )	threadingLockr  	functoolspartial_live_dash_fragmentscopyr   )rl  r  r  live_start_timer{   r  r  r  r  r  genrm  )
r  r  r  r  rl  r  rr   r{   r  r  rn   _prepare_live_from_start_formats~  s    
z*YoutubeIE._prepare_live_from_start_formatsc                 #   s<   d\}}d\d}	  dpt }
|
|p|
 |k}|r*
jtddd d}|	dd }	}d\ 	
fd	d
}
d| d  rt }	dkr_d S |rz
j|d dddd}W n tyx   d }Y nw t|dd d u r	d7 	d }qRn|d	dk\}	d7 	|sqR|krd }qRd7 |	dk r|dk r|	 }|rt|t	|d d   }z6t
|D ]!}|dd\}}|s|d }tdtd| }|dV  q|kr	d7 	nd	}W n
 ty   Y qRw r
d S ttd|| t   sUd S d S )N)r  i )NNTr   startzStarting download from the last 120 hours of the live stream since YouTube does not have data before that. If you think this is wrong,T	only_onceNNc           	         s  }  dd }|p|ot|to|jdk}|rdndp#df\| s9|r1s1dfS |kr9dfS r>}n/z
jd dddd\}}W n tyW   d }Y nw |sb	d7 	dfS tfd	d
|D }|d |d syJ tt	dd d 
d}d|fS )N
last_errori  r  iPF  FTr   errnoter     c                 3   r  )r  Nrm  )r|  x)stream_numberrm  rn  r    r  zUYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd.<locals>.<genexpr>r  fragment_base_urlz(?:/|^)sq/(\d+)pathr   )pop
isinstancer   status"_extract_mpd_formats_and_subtitlesr   r  intresearchgroup)	refresh_sequence	immediateold_mpd_urlr  expire_fastfmt_infofmtsr  	_last_seqctxr  r  r  r  last_seqmanifestless_orig_fmtr  mpd_urlno_fragment_scorerl  r  rm  rn  _extract_sequence_from_mpd  s:   
zBYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd[z"] Generating fragments for format    Fr  c                 S   s   t | jd S )NzX-Head-Seqnum)r!   headersr  rm  rm  rn  <lambda>  s    z0YoutubeIE._live_dash_fragments.<locals>.<lambda>r  rI  r   r  rh   zbreaking out of outer loopzsq/)r{   fragment_countr  )r  r  report_warningr   write_debug_request_webpager   r3   maxr  ranger:   sleep)rl  r  r  r  r  r  r  
FETCH_SPANMAX_DURATIONbegin_indexdownload_start_timelack_early_segments	known_idxlast_segment_urlr  
fetch_timeurlhshould_continueidxr  rm  r  rn  r    s   
" 



zYoutubeIE._live_dash_fragmentsc                 C   sT   |  ddgd p| j}|dkrdS td|s%| jd| dd	d
 dS |dS )Nplayer_js_versionr   r   actualr  z[0-9]{5,}@[0-9a-f]{8,}zInvalid player JS version "z?" specified. It should be "actual" or in the format of STS@HASHTr  @)rj  _DEFAULT_PLAYER_JS_VERSIONr  	fullmatchr  split)rl  r  rm  rm  rn  _get_player_js_version$  s   

z YoutubeIE._get_player_js_versionN)	player_idr  c                C   sr  |s|sJ d|s|  |}d}|  d }|r'||kr'd| d| }|}| ddgd p2| j}|g | jd	R vrQ| jd
| dd| j dd | j}|sp|r\| j|dd |d	krbd}tdd| d| j|  S | 	|d }|s|d	ks||krtd|S |d	kr|r|}nd}| jt
|||kod| d| d| dddd tdd| d| j|  S )Nz>_construct_player_url must take one of player_id or player_urlFr   Forcing player z in place of player player_js_variantr   r   r  z Invalid player JS variant name "z " requested. Valid choices are: , Tr  rq  https://www.youtube.com
/s/player//z	Forcing "z" player JS variant for player zoriginal url = z	
        delim)_extract_player_infor  rj  _DEFAULT_PLAYER_JS_VARIANT_PLAYER_JS_VARIANT_MAPr  joinr  r:   _get_player_id_variant_and_pathr"   )rl  r	  r  force_player_idplayer_id_overridevariantactual_variantrm  rm  rn  _construct_player_url/  sN   


zYoutubeIE._construct_player_urlr0  c                G   s&   t |dddtd}|sd S | j|dS )N).PLAYER_JS_URL).WEB_PLAYER_CONTEXT_CONFIGS.jsUrlF)get_allr  )r  )r1   strr  )rl  r0  ytcfgsr  rm  rm  rn  _extract_player_url\  s   zYoutubeIE._extract_player_urlc                 C   sp   |   d  }r| jd| dd | j|dS | jdd||d}|r4| jd	|d
|d}|r6| j|dS d S d S )Nr   r
  Tr  )r	  z"https://www.youtube.com/iframe_apizDownloading iframe API JS)r   r  retry_fatalzplayer\\?/([0-9a-fA-F]{8})\\?/zplayer versionr  )r  r  r  _download_webpage_with_retries_search_regex)rl  r  r  r  iframe_webpageplayer_versionrm  rm  rn  _download_player_urld  s    zYoutubeIE._download_player_urlc                    sr   |  |}ttj|jd| d | j p't fdd| j	 D d }|s4| j
d| dd || fS )Nr  r  c                 3   s2    | ]\}}t t |d d r|V  qdS )en_USz[a-zA-Z0-9_]+N)r  r  escapereplacer{  player_pathrm  rn  r  w  s    
z<YoutubeIE._get_player_id_variant_and_path.<locals>.<genexpr>z7Unable to determine player JS variant
        player = Tr  )r  r,   urllibparseurlparser  _INVERSE_PLAYER_JS_VARIANT_MAPr  r  itemsr  )rl  r  r	  r  rm  r-  rn  r  t  s   

z)YoutubeIE._get_player_id_variant_and_pathc                 C   s6   |  |\}}}|stddt|d}| d| S )Nz[^a-zA-Z0-9]r  z.js-)r  r  subr+   )rl  r  r	  r  r.  rm  rm  rn  _player_js_cache_key  s   zYoutubeIE._player_js_cache_keyc                 C   s(   t d| }r|dS td|)Nz"/s/player/(?P<id>[a-fA-F0-9]{8,})/rX   zCannot identify player )r  r  r  r   )r  r  mrm  rm  rn  r    s   
zYoutubeIE._extract_player_infoc                 C   sP   |  |}|| jvr"| j|||d| d| dd}|r"|| j|< | j|S )NzDownloading player zDownload of z failed)r  r   r  )r6  r  _download_webpager  )rl  r  r  r  player_js_keycoderm  rm  rn  _load_player  s   



zYoutubeIE._load_playeruse_disk_cachec                G   sp   d| |  |gtt|R }|| jv r| j| S |sd S | jj|d t|dd   dd}|r6|| j|< |S )Nyoutube-r   r   z
2025.07.21)min_ver)r6  mapr.   r  cacheloadr"   )rl  namer  r=  
cache_keyscache_iddatarm  rm  rn  _load_player_data_from_cache  s    

"
z&YoutubeIE._load_player_data_from_cachec                G   sd   d| |  |gtt|R }|| jvr.|| j|< |r0| j|d t|dd   | d S d S d S )Nr>  r   r   )r6  r@  r.   r  rA  storer"   )rl  rF  rC  r  r=  rD  rE  rm  rm  rn  _store_player_data_to_cache  s    

$z%YoutubeIE._store_player_data_to_cachec           	      C   s   |   d }|rt|S t|dthf}|r|S |s)d}|r"t|| | dS | d| }r3|S | j|||d }rRt| jd|dd|d	}|rR| 	|d| |S )
zr
        Extract signatureTimestamp (sts)
        Required to tell API what sig/player version is in use.
        r   STSz5Cannot extract signature timestamp without player urlNstsr  z2(?:signatureTimestamp|sts)\s*:\s*(?P<sts>[0-9]{5})zJS player signature timestamp)r  r  )
r  r  r1   r!   r   r  rG  r;  r&  rI  )	rl  r  r  ytcfgr  player_sts_overriderK  	error_msgr:  rm  rm  rn  _extract_signature_timestamp  s,   
z&YoutubeIE._extract_signature_timestampc                    s  d d  fddtdD }tdD ]s\}}|rdnd}t|d|d	ftd
}|s6| d| d  d S tj|}tj	|j
}	tt|	dpLdgd d g}
|	dg|g|
dd |rj|	d|
d tj|jtj|	dd}| j||d| dddd qd S )Nz@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_r   c                 3   s$    | ]} t d dd@  V  qdS )r      ?   N)randomrandint)r|  r  CPN_ALPHABETrm  rn  r       " z*YoutubeIE._mark_watched.<locals>.<genexpr>   )videostatsPlaybackUrlvideostatsWatchtimeUrlzfully playbackTrackingbaseUrlr  zUnable to mark watchedlenz1.5r   r   2
detailpage)vercpncmtel)stetT)queryzMarking zUnable to mark watchedFr  )r  r  	enumerater    r9   r  r/  r0  r1  r)   rf  r!  floatr  update
urlunparse_replace	urlencoder8  )rl  r  player_responsesra  is_fullkeylabelr{   
parsed_urlr  video_lengthrm  rT  rn  _mark_watched  s@   "zYoutubeIE._mark_watchedc                 #   s    t d|}|r| |d| V  | jt ||E d H  t d|D ]}| t|| |V  q&t d|D ]}| |d | |d V  q9d S )NzZ<link rel="alternate" href="(?P<url>https://www\.youtube\.com/watch\?v=[0-9A-Za-z_-]{11})"r{   z(class="lazyYT" data-youtube-id="([^"]+)"z(?x)<div[^>]+
                class=(?P<q1>[\'"])[^\'"]*\byvii_single_video_player\b[^\'"]*(?P=q1)[^>]+
                data-video_id=(?P<q2>[\'"])([^\'"]+)(?P=q2)r  )	r  r  
url_resultr  StopExtractionr  _extract_from_webpagefindallr4   )r  r{   r0  mobjid_r7  r  rm  rn  rv    s    zYoutubeIE._extract_from_webpagec                 C   s    |  |}|std| |S )NzInvalid URL: )get_temp_idr   )r  r{   r  rm  rm  rn  
extract_id	  s   
zYoutubeIE.extract_idc                 C   s(   t |dtd}| j|dd dd |dS )N)playerOverlaysplayerOverlayRendererdecoratedPlayerBarRendererr~  	playerBarchapteredPlayerBarRendererr   r  c                 S   s   t t| dddS )N)chapterRenderertimeRangeStartMillis  scale)r   r1   chapterrm  rm  rn  r   	  s    
z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>c                 S   s   t | dtdS )N)r  r\   
simpleTextr  )r1   r!  r  rm  rm  rn  r  "	  s    )start_functiontitle_functionrh   )r1   r  _extract_chapters_helper)rl  rF  rh   chapter_listrm  rm  rn  _extract_chapters_from_json	  s   z%YoutubeIE._extract_chapters_from_jsonc                    sJ   t |dtd}fdd fddttd  fdd|D g S )N)engagementPanels."engagementPanelSectionListRenderercontentmacroMarkersListRenderercontentsr  c                    s   t  | dS )NtimeDescription)r'   	_get_textr  rk  rm  rn  r  +	      zCYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<lambda>c                    s     | dS )Nr\   r  r  rk  rm  rn  r  ,	      c                 3   s&    | ]} t|d  V  qdS )).macroMarkersListItemRendererN)r  r1   )r|  r  chapter_timechapter_titlerh   rl  rm  rn  r  .	  s    
zDYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<genexpr>)r1   r  r  filter)rl  rF  rh   content_listrm  r  rn  '_extract_chapters_from_engagement_panel&	  s   z1YoutubeIE._extract_chapters_from_engagement_panelc                 C   sF   t |ddddd dddd	d
dtddhfdd hdthfdf
p"d S )NframeworkUpdatesentityBatchUpdate	mutationsc                 S   s   |d d d d dkS )NpayloadmacroMarkersListEntitymarkersList
markerTypeMARKER_TYPE_HEATMAPrm  r  r~  rm  rm  rn  r  6	  s    z,YoutubeIE._extract_heatmap.<locals>.<lambda>r  r  r  markers.startMillisr  r  c                 S   s   t | d t | d  d S )Nr  durationMillisr  )r  r  rm  rm  rn  r  9	  s    intensityScoreNormalized)rr   rj   value)r1   r   )rl  rF  rm  rm  rn  _extract_heatmap3	  s   
zYoutubeIE._extract_heatmapc                 C   s   t |ddthf}t|ddthf }sd S t |ddthf}t|ddthfp)d}||p.dd	t|dd
d
thfddthfdd| jhfddthfddthfddthfddthfddddtdhfddd|d u rld n|	ddk|| 
|dS )Nr  commentEntityPayload
properties	commentId#engagementToolbarStateEntityPayloadpublishedTimer   root)rX   parentr  toolbarlikeCountA11yauthor	channelIddisplayNameavatarThumbnailUrl	isCreator
isVerifiedchannelCommandinnertubeCommandbrowseEndpointcanonicalBaseUrlcommandMetadatawebCommandMetadatar{   r  )textrm   	author_idr  author_thumbnailauthor_is_uploaderauthor_is_verified
author_urlFr   
heartStateTOOLBAR_HEART_STATE_HEARTED)is_favorited
_time_textru   )r    r  r1   r!  r&   ucid_or_noner9   boolr:   r  _parse_time_text)rl  entitiesr  comment_entity_payload
comment_idtoolbar_entity_payload	time_textrm  rm  rn  _extract_comment=	  s8   




zYoutubeIE._extract_commentc                 C   s(  | d}|s	d S || |d| |dt|ddd| jhf| |dt|dd	d
dthf|p0dd}| |dp:d}| |}|||d tdt|dt	dd|d< t|d}|d urb||d< t|dt
d}|d ursd|v |d< | t|dg}	| |	tjrd|d< t|d}
|
rd|d < |S )!Nr  contentText	voteCountauthorEndpointr  browseId
authorTextauthorThumbnail
thumbnailsr  r{   r  )rX   r  rm   r  r  r  r  publishedTimeTextr   )r  ru   r  )r  r  Fr  r   r  authorIsChannelOwnerr  )actionButtonscommentActionButtonsRendererr  creatorHeartr  authorCommentBadgeTr  pinnedCommentBadge	is_pinned)r  r  
_get_countr1   r  r9   r  ri  r:   r!  r  _extract_badges
_has_badger   VERIFIED)rl  comment_rendererr  r  infor  ru   r  comment_abrbadgesr  rm  rm  rn  _extract_comment_oldZ	  sJ   






zYoutubeIE._extract_comment_oldc                 #   s   fddfdd} 	f	dd s+dd dddt  t  dd	d
 ddgd  D ^}}	|k rFd S |}
d }d}|d u }|ra|
sa}
d}d}tdD ]}|
sn nj	|d}dd  dd  d}|dkr|rd}ndd |f }nd	|rdnd|rdnd||}d }|sĈd dkrd dksg |d|rdndg}zj
d |
d 	|||d!}W n2 ty } z%d"t| v r|rd#d$v rd% W Y d }~ d S td&dd' d }~ww d}d }
t|d(d)d*dthf}t||tg d+D ]5}|r.||}
d}|
r, n&q ||||D ]}|s?   d S |V  q5d,|i}
|
rP nqqhj|d-d.d/}|rv|sxd dkrzjd0| dd1 jd S d S d S )2Nc                    s     | dgd S )Nr   r   ri  )crk  rm  rn  r  	      z,YoutubeIE._comment_entries.<locals>.<lambda>c                    s   d }| D ]d}t |d}|dd}|d ur#|d< d| d tddk t| fd	d
tp6i }|dp=i }|pG|}|sKqt	|d}|s\ dkrZdnd}d|
    |S |S )NcommentsHeaderRenderer	countTextcommentsCount	est_totalzDownloading ~z	 commentscomment_sorttopc                    s   | d d d   S )NsortMenusortFilterSubMenuRenderersubMenuItemsrm  r  comment_sort_indexrm  rn  r  	      zDYoutubeIE._comment_entries.<locals>.extract_header.<locals>.<lambda>serviceEndpointr\   r   ztop commentsznewest firstzSorting comments by )r1   r  	to_screenr  r3   r  r  _extract_continuation_ep_data_extract_continuationr.   lower)r  _continuationr  comments_header_rendererexpected_comment_countsort_menu_itemsort_continuation_ep	sort_text)get_single_config_argrl  trackerr  rn  extract_header	  s4   
z2YoutubeIE._comment_entries.<locals>.extract_headerc                 3   sT   |sdd< |k rd S | D ]}|sd krd V  t |dd }|s:t||fddggti d}||}n9t|d	d	thfpJt|d	thf}t|d
thf  sVqt| fdd}	|	|}|rst|dthfd u|d< |svq|d }
|drd |
 |
d v r|
d v r|dsq	d|rdnd d d V   d S d |
 d  d7  < |rdnd  d7  < |V  t |dd t}|r't|ddthf}t|dd  }r|||
|d D ]}|r|V  qt|dd sqd  d7  < j
|	|
|d d}t|ttdd  E d H  qd S )Nr   current_page_threadtotal_parent_commentsc                 S      | d S NcommentThreadRendererrm  r  rm  rm  rn  r  	      zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>commentRenderer)commentr  r  rh  commentViewModel)
commentKeytoolbarStateKeyc                    s   |d  v S )N	entityKeyrm  r  comment_keysrm  rn  r  	  r  
pinnedTextr  rX   pinned_comment_idsseen_comment_idsz?Detected YouTube comments looping. Stopping comment extraction zfor this threadr   z$ as we probably cannot get any more.running_totalr   total_reply_commentsc                 S      | d d S )NrepliescommentRepliesRendererrm  r  rm  rm  rn  r  	  r  
subThreads.c                 S      |d S r  rm  r  rm  rm  rn  r  	  r  c                 S   r'  )NcontinuationItemRendererrm  r  rm  rm  rn  r  	  r  )r  r  depth)r3   r    r  r  r1   r!  r  r  addr  _comment_entries	itertoolsisliceminr  )r  entity_payloadsthread_parentthread_depthr  comment_thread_rendererr  r  
view_modelr  r  comment_replies_renderer
subthreadsthreadsentrycomment_entries_iter)	extract_thread	max_depthmax_parentsmax_repliesmax_replies_per_threadrl  r  r  rL  r  rn  r9  	  s   




z2YoutubeIE._comment_entries.<locals>.extract_threadr   )r!  r  r  r  r"  r   r  c                 s   s    | ]
}t |tjd V  qdS )rg  N)r!   sysmaxsizer|  prm  rm  rn  r  	
  s    
z-YoutubeIE._comment_entries.<locals>.<genexpr>max_commentsr   r  FT)onResponseReceivedEndpoints.)reloadContinuationItemsCommandappendContinuationItemsActioncontinuationItems)rL  visitor_data(r!  z/~r  )z$Downloading comment section API JSONz3    Downloading comment API JSON reply thread %d %sr  z+{}Downloading comment{} API JSON page {} {}z       z replies.r  )r  r  r  r  )item_idrf  eprL  r  r   check_get_keyszincomplete dataignoreerrors)Tonly_downloadzReceived incomplete data for a comment reply thread and retrying did not help. Ignoring to let other comments be downloaded. Pass --no-ignore-errors to not ignore.zyIncomplete data received for comment reply thread. Pass --ignore-errors to ignore and allow rest of comments to download.expectedr  r  r  r  r  )r  .messageRendererr  r   max_runszYoutube said: r  r  )setrj  r  _build_api_continuation_query_generate_comment_continuationr,  countgenerate_api_headers_extract_visitor_datar   _extract_responser   r!  r  	get_paramr  r1   r  r  r  CommentsDisabled)rl  root_continuation_datarL  r  r  r  r)  r  _max_commentsr  continuationresponseis_forced_continuationis_first_continuationcontinuation_items_pathpage_numr  comment_prog_strnote_prefixrL  er  continuation_itemsr7  messagerm  )
r9  r  r:  r;  r<  r=  rl  r  r  rL  rn  r+  	  s   S






zYoutubeIE._comment_entriesc                 C   s$   d|  d|  d}t |  S )zZ
        Generates initial comment section continuation token from given video id
        zz2'""z0 x0 Bcomments-section)base64	b64encodeencodedecode)r  tokenrm  rm  rn  rW  c
  s   z(YoutubeIE._generate_comment_continuationc                    s8    fdd}t  ddgd }t||d|S )zEntry for comment extractionc                 3   s8    t dd t| di dD d } |E d H  d S )Nc                 s   s"    | ]}| d dkr|V  qdS )sectionIdentifiercomment-item-sectionNr  )r|  itemrm  rm  rn  r  n
  s    zIYoutubeIE._get_comments.<locals>._real_comment_extract.<locals>.<genexpr>).itemSectionRendererrg  )r  r1   r+  )r  rendererrl  r  rL  rm  rn  _real_comment_extractm
  s   z6YoutubeIE._get_comments.<locals>._real_comment_extractrB  r   r   )r!   rj  r,  r-  )rl  rL  r  r  r0  rv  rB  rm  ru  rn  _get_commentsk
  s   zYoutubeIE._get_commentsc                   C   s
   dddS )NT)contentCheckOkracyCheckOkrm  rm  rm  rm  rn  _get_checkok_paramsv
  s   
zYoutubeIE._get_checkok_paramsc                 C   s@   ddi}|d ur||d< d|i}|rddi|d< d|i|   S )	Nhtml5PreferenceHTML5_PREF_WANTSsignatureTimestampcontentPlaybackContextpyvTadPlaybackContextplaybackContext)rz  )r  rK  use_ad_playback_contextcontextplayback_contextrm  rm  rn  _generate_player_contextz
  s   z"YoutubeIE._generate_player_contextclientr  c           
   
   C   s   | j dg tdd}|D ]k}|d\}}}|s#| jd| ddd q|d\}}}	| |kr2q|sC| jd	| d
dd tjj}	|	 |jkrKqzt	
t	tj| W   S  tjtfyv   | jd| d|	 ddd Y qw d S )Npo_tokenT)ie_key	casesense+zPInvalid po_token configuration format. Expected "CLIENT.CONTEXT+PO_TOKEN", got ""r  .zpo_token configuration for zo client is missing a context; assuming GVS. You can provide a context with the format "CLIENT.CONTEXT+PO_TOKEN"z#Invalid po_token configuration for z	 client: z/ PO Token should be a base64url-encoded string.)rj  rF   	partitionr  r  r  r	   GVSr  rk  urlsafe_b64encodeurlsafe_b64decoder/  r0  unquotern  binasciiError
ValueError)
rl  r  r  po_token_strs	token_strpo_token_metasepr  po_token_clientpo_token_contextrm  rm  rn  _get_config_po_token
  sD   
"zYoutubeIE._get_config_po_tokenrS   c                 K   s  d}t |dddtjjhf}dt |dv r$| j| d| dd	d
 d	}|r?|tjkr?|s?| js?|s?| jd| dd	d
 dS |tj	krQ|sQ| d| d dS | 
||}|r|rp|tjkrp|sp| jrp|sp| d| d | | d|j d| d |S |r|tjkr|s| jr| jd| dd	d
 dS | jd||j|||||||	|
|d|}|r| | d|j d| d |S dS )a  
        Fetch a PO Token for a given client and context. This function will validate required parameters for a given context and client.

        EXPERIMENTAL: This method is unstable and may change or be removed without notice.

        @param client: The client to fetch the PO Token for.
        @param context: The context in which the PO Token is used.
        @param ytcfg: The ytcfg for the client.
        @param visitor_data: visitor data.
        @param data_sync_id: data sync ID.
        @param session_index: session index.
        @param player_url: player URL.
        @param video_id: video ID.
        @param webpage: video webpage.
        @param required: Whether the PO Token is required (i.e. try to fetch unless policy is "never").
        @param kwargs: Additional arguments to pass down. May be more added in the future.
        @return: The fetched PO Token. None if it could not be fetched.
        Fr  .serializedExperimentFlagstrue).html5_generate_content_po_tokenr  z;: Detected experiment to bind GVS PO Token to video ID for z clientTr  z!Unable to fetch GVS PO Token for zz client: Missing required Visitor Data. You may need to pass Visitor Data with --extractor-args "youtube:visitor_data=XXX"Nz$Unable to fetch Player PO Token for z" client: Missing required Video IDzGot a GVS PO Token for z client, but missing Data Sync ID for account. Formats may not work.You may need to pass a Data Sync ID with --extractor-args "youtube:data_sync_id=XXX"z: Retrieved a z PO Token for z client from configz client: Missing required Data Sync ID for account. You may need to pass a Data Sync ID with --extractor-args "youtube:data_sync_id=XXX")r  r  rL  rG  data_sync_idsession_indexr  r  video_webpagerequired_gvs_bind_to_video_idrm  )r1   r/  r0  r)   r  r	   r  is_authenticatedr  PLAYERr  r  _fetch_po_token)rl  r  r  rL  rG  r  r  r  r  r0  r  r  gvs_bind_to_video_idexperimentsconfig_po_tokenr  rm  rm  rn  fetch_po_token
  s   





zYoutubeIE.fetch_po_tokenc           	      K   s  | d}| jddgtdd }|dvrd}|dks$|dkr&| d	d
s&d S | d }| jj }t| t|| | j	d |d}t
d%i dt|dt|dd|d|d| dd| dd| dd| jd| dd| dd| dd| jjd| dd
dtd|ptd| |d|d| dd | d! d"| d#d$d
}| j|S d|d| dd | d! d"| d#d$d
}| j|S )&Nr  	fetch_potr   )r  r   )neverautoalwaysr  r  r  Fhttp_headers)default_clientinnertube_context)rL  INNERTUBE_CONTEXTinnertube_hostinternal_client_namer  r  r  r  rG  r  r  request_cookiejarr  request_proxyr  zhttps://request_headersrequest_timeoutsocket_timeoutrequest_verify_tlsnocheckcertificaterequest_source_addresssource_addressbypass_cacherm  )r  rj  rF   r\  r  _downloaderproxiesr<   r=   _select_api_hostnamer   r   r1   r  	cookiejarr>   r  get_po_token)	rl  r  r  r  fetch_pot_policyr  r  r  pot_requestrm  rm  rn  r    s   







	







zYoutubeIE._fetch_po_tokenc                    s2   t | drdS t | d d}t fdd|D S )N)playabilityStatusdesktopLegacyAgeGateReasonT)r  )r  reason)zconfirm your agezage-restrictedinappropriateage_verification_requiredage_check_requiredc                 3   s"    | ]} D ]}||v V  qqd S r  rm  )r|  rP  r  reasonsrm  rn  r  M  s     z)YoutubeIE._is_agegated.<locals>.<genexpr>)r1   any)rf  AGE_GATE_REASONSrm  r  rn  _is_agegatedC  s
   

zYoutubeIE._is_agegatedc                 C   s   t | ddkS )N)r  r  
UNPLAYABLEr1   )rf  rm  rm  rn  _is_unplayableO  s   zYoutubeIE._is_unplayablec
                 C   s&  | j |||| ||| |d p| |||| |d p$| |||d}
d|i}ttt|d dthf}| j	d|gddd  }rI||d	< |	rQd
|	i|d< |r\| j
|||ddnd }| 	ddgd dkoqtt|dthf}|| || | j|d|||
d|d|dd dpd S )Nr   r   )rL  r  rG  r  delegated_session_iduser_session_idvideoIdPLAYER_PARAMSplayer_paramsTr  r   poTokenserviceIntegrityDimensionsFr  r  falseSUPPORTS_AD_PLAYBACK_CONTEXTplayerzDownloading {} player API JSONr   )rJ  rK  rf  rL  r  r  r  r   )rY  _extract_session_index_parse_data_sync_id_extract_delegated_session_id_extract_user_session_idr1   r   r
   r!  rj  rO  r  ri  r  r[  r   r,  strip)rl  r  r  webpage_ytcfgplayer_ytcfgr  
initial_prrG  r  r  r  yt_query
default_ppr  rK  r  rm  rm  rn  _extract_player_responseS  s@   
z"YoutubeIE._extract_player_responsec                 C   s  g }g }t dd | jj D }|r| jn| jr| jn|s!| jn| j}t	dd t
D dd dd}| dD ]8}	|	d	krC|| q7|	d
krM|| q7|	dr\||	dd   q7|	|vrj| d|	 d q7||	 q7|s|s|| jkr| jdt ddd |s|| |D ]}
|
|v r||
 q|stddd| jr|ds| |rd|vr|d dd |D }|D ]}	| jd|	 ddd ||	 qt|S )Nc                 s       | ]}|  V  qd S r  is_availabler@  rm  rm  rn  r        z3YoutubeIE._get_requested_clients.<locals>.<genexpr>c                 s   s$    | ]}|d d dkr|V  qd S )Nr   r  rm  r|  r  rm  rm  rn  r    rV  c                 S   s   t |  d S )Npriorityr   )r  rm  rm  rn  r    r  z2YoutubeIE._get_requested_clients.<locals>.<lambda>T)ro  reverser   rh  allr4  r   zSkipping unsupported client "r  a  No supported JavaScript runtime could be found. Only deno is enabled by default; to use another runtime add  --js-runtimes RUNTIME[:PATH]  to your command/config. YouTube extraction without a JS runtime has been deprecated, and some formats may be missing. See  z  for details on installing oner  z%No player clients have been requestedrO  is_music_url	web_musicc                 S   s   g | ]
}t | d  s|qS )SUPPORTS_COOKIESr  r  rm  rm  rn  r    s
    z4YoutubeIE._get_requested_clients.<locals>.<listcomp>zSkipping client "z#" since it does not support cookies)r  r  	providersvalues_DEFAULT_PREMIUM_CLIENTSr  _DEFAULT_AUTHED_CLIENTS_DEFAULT_JSLESS_CLIENTS_DEFAULT_CLIENTSsortedr   rj  extend
startswithappendr  r   remover   r  r  r$   )rl  r{   r  is_premium_subscriberrequested_clientsexcluded_clientsjs_runtime_availabledefault_clientsallowed_clientsr  excluded_clientunsupported_clientsrm  rm  rn  _get_requested_clients~  s^   





z YoutubeIE._get_requested_clientsc                 C   s   t |d }|kr|S d S )N)r  r  r  )rl  prr  pr_idrm  rm  rn  _invalid_player_response  s   z"YoutubeIE._invalid_player_responsec           #         s  d }|r| j | j|| d|dd}g }g }	|r)| ||s)|i |dd i t d d d  fdd}
d}d  } }}i }r=d}t \}}}||krY|ni }d| d	vrn||krn| ||pm|}|pw| j	|||d
}| 
|d}d| d	v rd}d }|s|s|r| |}d}d }||krd| jvr|}|p| |||}|p| |||}|||| jr|nd |r|nd || |||p| 
|d}| 
|d }|rd n| jd.dtji|d|jp|ji}tj| jfdtji|}tj| jfdtji|}z|p | j|||p|||||||d	}W n ty: } z| | W Y d }~qEd }~ww | || }rI|||< nd|rt|pT| 
|d}|di }||t < ||t!< t"||t#< ||t$< ||t%< ||t&< | '||||t(< t|ddt)hfD ]} || t < || t!< || t&< t"|| t#< q|r|	| n|| |dkr| *|r|rd|v rt+dd | j,j-. D r|
d | /|r|dkr|
d|  | /|r| js| j0| d| j1 dd |dko| *|}!| jr | /|s|!r | j0| ddd |
d  t|d!d"t2hf}"|"d#vr;| 3| d$| d%|"  sH|4|	 |rk| d&d'5| d(d'5t|.  d)| d* |sgtd+dd,||fS |srtd-||fS )/Nz client initial player responseFr  streamingDatar  c                     sD   | D ]}t |d }|tv r| vr|  |  dS qdS )z? Append the first client name that exists but not already used r   N)r
   r   r   r*  )client_namesclient_nameactual_clientall_clientsclientsrm  rn  append_client  s   

z:YoutubeIE._extract_player_responses.<locals>.append_clientr  r  r  REQUIRE_JS_PLAYERjsTrf  )r  rG  r  r  r  r0  r  rL  PLAYER_PO_TOKEN_POLICYr  r  )r  r  r  r  rG  r  r  r  r  adaptiveFormats.rR   zmade for kidsc                 s   r  r  r  r@  rm  rm  rn  r  3  r  z6YoutubeIE._extract_player_responses.<locals>.<genexpr>web_embeddedzweb_embedded.zT: This video is age-restricted; some formats may be missing without authentication. r  zm: This video is age-restricted and YouTube is requiring account age-verification; some formats may be missingrV   r  r  )OKLIVE_STREAM_OFFLINEAGE_CHECK_REQUIREDAGE_VERIFICATION_REQUIRED: z% player response playability status: zSkipping player responses from r  z* clients (got player responses for video "z" instead of "z")zLAll player responses are invalid. Your IP is likely being blocked by YoutuberO  z%Failed to extract any player responserm  )6_search_json_YT_INITIAL_PLAYER_RESPONSE_REr  r   rU  r
   r  rj  _download_ytcfgr#  _get_default_ytcfgr  r)  ro  rZ  _extract_data_sync_idr  r  r  r	   r  r  recommendedr  r  r  SUBSr  r   r  r1   
setdefaultSTREAMING_DATA_CLIENT_NAME!STREAMING_DATA_FETCH_GVS_PO_TOKENr  $STREAMING_DATA_PLAYER_TOKEN_PROVIDED STREAMING_DATA_INNERTUBE_CONTEXT"STREAMING_DATA_FETCH_SUBS_PO_TOKEN$STREAMING_DATA_IS_PREMIUM_SUBSCRIBER_get_available_at_timestamp%STREAMING_DATA_AVAILABLE_AT_TIMESTAMPr  r  r  r  r  r  r  r  _youtube_login_hintr!  r  r  r  )#rl  r  r  r0  webpage_clientr  r  r  r  deprioritized_prsr  tried_iframe_fallbackr  rG  r  skipped_clientsdeprioritize_prr  base_clientr  r  require_js_playerr  fetch_po_token_argsplayer_pot_policyplayer_po_tokenfetch_gvs_po_token_funcfetch_subs_po_token_funcrh  r  r  sdr  embedding_is_disabledr  rm  r  rn  _extract_player_responses  s$  






	





tz#YoutubeIE._extract_player_responsesc                 C   s2   |dkr	|  ds|dkr|pddkr|S d S d S )Nr  live_from_start	post_liver   i   )r\  )rl  rn   rh   rm  rm  rn  _needs_live_processing[  s   z YoutubeIE._needs_live_processingc              	   C   sZ   | d| d| d| dt  	}|g | j| jR v r$| j|dd d S | j|dd d S )Nr    client z formats require a GVS PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a GVS PO Token for this client with --extractor-args "youtube:po_token=z+.gvs+XXX". For more information, refer to  Tr  )PO_TOKEN_GUIDE_URLr  r  r  r  )rl  r  r  protomsgrm  rm  rn  _report_pot_format_skipped`  s   z$YoutubeIE._report_pot_format_skippedc                 C   s|   |p| d| d| dt  }t| d| d| df}|r,|g | j| jR v r5| j|dd d S | j|dd d S )	Nz: Some z client subtitles require a PO Token which was not provided. They will be discarded since they are not downloadable as-is. You can manually pass a Subtitles PO Token for this client with --extractor-args "youtube:po_token=z-.subs+XXX" . For more information, refer to  writesubtitleswriteautomaticsublistsubtitlesTr  )rE  r  r\  r  r  r  r  )rl  r  r  rG  subs_wantedrm  rm  rn  _report_pot_subtitles_skippedm  s   z'YoutubeIE._report_pot_subtitles_skippedc           "      #   s   d ddd d it tg  i dd ii }tg dddv d	d		vd
	v drEdjd dd dd  fdddd i fdd
fdd}t t "fddt|ddthfD ]R}t|ddthfD ];}	|		d}
d }|
st
j|		d }t|ddthf}
t|d!}|rt| t|
thd"df }rƈ| qt|d#|hf q|D ]p}t|d}|sq|t |t |t |	t|t t|d$!d%d& dK
"f	d(d)	 	
 !"fd*d+}| E d H  }td,}|d-ksJ|rOrO|d. rad-kra|d-kra|d/ fd0d1}d.|voz|	d2}|r_t
j|j}td3| }r|d4d5\}}nd6}d'}||}|rs  d"|}|r|d7| d7| }||v }d8 tj  }|}	|p|j!d9}|r|"d:d;|  }vr|< |r|sd<dvr#"d. nT|s|s_t$|| | d=}j%|"d>d'd-kd?\}}t|ddthfD ]}|t< q2&||}|D ]}||d.j'd@|d dAd dB|oW| r]|V  qBd/|voh|	dC} | rFt
j| j}d'}|| }|rs  d"|}|r|d7| d7| }||v }d8 tj( }|}	|p|j!d9}|r|"d:d;|  }vr|< |r|sd<dvr#"d/ q|s|sFt$| |d=} j)| "d'dD\}!}t|ddthfD ]}|t< q&||}|!D ]1}||d/|dE |o"| rDt*j'dF|	dGp2|d dHd dB|dI< |rAd|dJ< |V  qq|V  d S )LNi   ri   r  r   )tinyaudio_quality_ultralowaudio_quality_lowaudio_quality_mediumaudio_quality_highsmallmediumlargehd720hd1080hd1440hd2160hd2880highresr  r  r  
incomplete	duplicateinclude_duplicate_formatsTzv[youtube] include_duplicate_formats extractor argument is deprecated. Use formats=duplicate extractor argument insteadc              	   S   s"   dt | thddtjjhddfv S )N1xtags.sr)r1   r)   r/  r0  )f_urlrm  rm  rn  is_super_resolution     "zEYoutubeIE._extract_formats_and_subtitles.<locals>.is_super_resolutionc                    s   d  fdd|D S )Nr   c                 3   s    | ]} | V  qd S r  rm  )r|  isrm  rn  r    r  zNYoutubeIE._extract_formats_and_subtitles.<locals>.solve_sig.<locals>.<genexpr>)r  )rg  specrm  rf  rn  	solve_sig  s   z;YoutubeIE._extract_formats_and_subtitles.<locals>.solve_sigc                    s$   t  fddtd d D S )Nc                 3   sB    | ]}d t d  d| dt|  d d  iiV  qdS )r{   r  r4  r   filesizeN)r8   r.  )r|  range_start)
CHUNK_SIZEr  rm  rn  r    s    
 zTYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragments.<locals>.<genexpr>r   rj  )r   r  r  )rl  rm  rn  build_fragments  s   zAYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragmentsc                 S   s   | j o| jo| o| jo| S r  )r  not_required_with_player_tokennot_required_for_premium)policyr  has_player_tokenrm  rm  rn  gvs_pot_required  s
   

zBYoutubeIE._extract_formats_and_subtitles.<locals>.gvs_pot_requiredc                    s   |  dpi }| dpd}| dddd pd }d| v r(t|dd	fS d
| v r=|r9 s9|< |fS | drQ|rM  sM| < | fS |dfS )N
audioTrackr  r   rX   r  r   descriptivedescoriginalaudioIsDefaultr  )r  r  r  r"   )
fmt_streamaudio_trackdisplay_namelanguage_code)DEFAULT_LANG_VALUEORIGINAL_LANG_VALUElanguage_maprm  rn   get_language_code_and_preference  s   
zRYoutubeIE._extract_formats_and_subtitles.<locals>.get_language_code_and_preferencec                    s(   t | sd S  jdtj| jdd dS )Nz/n/([^/]+)/zn challengerg  )r9   r&  r/  r0  r1  r  )r  rk  rm  rn  get_manifest_n_challenge  s   zJYoutubeIE._extract_formats_and_subtitles.<locals>.get_manifest_n_challengec               	      s  g }  r|  ttjtt dd rFt }D ]}jd|ddr,|| q	| |  ttj
tdd D dd | r̈j| D ]T\}}|jtj
kr|jj D ] \}}t|}jdd |D d|dd |v r~| q^qN|jtjkr|jj D ]\}}|d	| | v r | qqNd
t }rjd| dd  rjd| dd      d S d S )N)
challengesr  )typer  inputsigfuncsTr<  c                 S   s    g | ]}d  ttt|qS )r   )r  r@  chrr  )r|  spec_idrm  rm  rn  r    s     zYYoutubeIE._extract_formats_and_subtitles.<locals>.solve_js_challenges.<locals>.<listcomp>c                 S   s   g | ]}t |qS rm  )ord)r|  r  rm  rm  rn  r    r   nzEnsure you have a supported JavaScript runtime and challenge solver script distribution installed. Review any warnings presented before this message. For more details, refer to  z7Signature solving failed: Some formats may be missing. rT  z9n challenge solving failed: Some formats may be missing. )r   r   r   Nr   r  rU  rG  r*  difference_updateSIGr   r  
bulk_solver  outputresultsr3  r]  rI  r  r   r  clear)challenge_requestscached_sigfuncsr  _challenge_requestchallenge_response	challengeresulthelp_message)n_challengesr  s_challengesrl  r  rm  rn  solve_js_challenges  st   



zEYoutubeIE._extract_formats_and_subtitles.<locals>.solve_js_challenges.r  r  r{   signatureCipherrg  r   r  )hlsManifestUrldashManifestUrl)r  .c                 S   s"   t | dt| dd| dfS )Nitagrt  rX   isDrc)r.   r  r1   )rz  rm  rm  rn  get_stream_id(  rd  z?YoutubeIE._extract_formats_and_subtitles.<locals>.get_stream_idFc                    s  t | d}| dpi }| d}t| d}|dks |s*| dd p)|}|dkr0d}|r>|r8||< |r>||< | \}}	t| d	}
|
rnd
 d| d}dkrf|jr`dnd d7 }j|	dd t| dpx| dd}t| dtddhf t	 fdd}|rjd
 d| d	dd |rd
dvr	| d S | dp|ddpd}t| dpd }i d!t| d"d#t| d$d%t|| d&rd'n|rd(nd d)tt|d*|d+od,d-d.|| d&od/|od0t| d1d t| d2d |od3|od4d5s#o&td6d.
d7|d8kr2d9nd:d;|v r:d<nd  d|d=krE|nd d>| d?d|d|t| d&d@  dA|
dB|dCt| dDt| dDdE|dF|	dG|r~dHn|dkrdInd }tdJ| dKpd}|rt|d=|dL< |t|d@ dM|dN|dOfv }|r|dLr|dL dP |dQ< |S )RNr  rt  qualityheightrN  audioQualityr   r  drmFamilieszSome rD  z6 formats have been skipped as they are DRM protected. rp  Your accountThe current sessionz may have an experiment that applies DRM to all videos on the tv client. See  https://github.com/yt-dlp/yt-dlp/issues/12563  for more details.Tr  averageBitratebitrater  approxDurationMsr  c                      s    d k S )Nr  rm  rm  )rh   format_durationrm  rn  r  P  r  zYYoutubeIE._extract_formats_and_subtitles.<locals>.process_format_stream.<locals>.<lambda>z9 formats are possibly damaged. They will be deprioritizedmissing_potr  qualityLabelaudio_quality_fpsr   asraudioSampleRaterj  contentLengthr  r  drcra  format_noter  ry  	(default)r  r  DRCzAI-upscaledc                 S      | d  dd S )NprojectionTypeRECTANGULARr   r,  r  r  rm  rm  rn  r  e  r   c                 S   r  )NspatialAudioTypeSPATIAL_AUDIO_TYPE_r   r  r  rm  rm  rn  r  f  r   DAMAGEDMISSING POTverboser  source_preference22r  Premiumd   r   audio_channelsaudioChannelsr  has_drmtbrfilesize_approxwidthlanguagelanguage_preference
preferencerw  z.((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?mimeTyperZ   noneacodecvcodec_dash	container)r.   r  r!   r  r  r  r  r   r1   r2   rj  rH  r,  r"   r3   r\  r   r   r  matchr#   r  ri  r%   )rz  rF  r  super_resolutionr  r{  r  r  r}  r  r  rG  r  
is_damagedrC  r  dct	mime_mobjsingle_stream)	all_formatsr  rh   r  itag_qualitiesqres_qualitiesrl  r  )r  rn  process_format_stream+  s   
$

zGYoutubeIE._extract_formats_and_subtitles.<locals>.process_format_streamc                  3   s   d} g }D ]A}| drrq| ddkr!t| ds!q|}s,|v r,qd tj }|d dvoA	|}
 pN|pL|jd	}|rY
vrY|
< | d
}d\}}	|s| tj| d}	t	|	d
dt
hf}t	|	d}t|	|p|fsd}
dv rj|
 dddd ndjrdnd }j|
d|dd q|| |o| |d}|sq|rrq  jdt|dd}|sq|dt	|	dpd||7 }t|}| drrq|d d }  d|}|sqt|d|i}|rt|d|i}||d
< |d r;|d  | | d f | d!vrD|d"< || q|D ]:}sVd#v rt|d$ rti |rh|d%  d&n|d% d'|d(V  s|d#vrd) i|d*< |V  qLd S )+NhttpstargetDurationSecr  FORMAT_STREAM_TYPE_OTFr  GVS_PO_TOKEN_POLICYr   )18r  r{   r  r  r  z{}Some {} client https formats have been skipped as they are missing a URL. {}. See  https://github.com/yt-dlp/yt-dlp/issues/12482  for more details)rS   rT   r   z1YouTube is forcing SABR streaming for this clientTr  z@YouTube may have enabled the SABR-only streaming experiment for zyour accountzthe current sessionr   )r  r  r  r<  z&{}={})spr  	signaturer  potr  r  rB  available_atdashyrj  r  z-dashyhttp_dash_segments)r  r  r  http_chunk_sizedownloader_options)r  r  r$  r   HTTPSr&  r/  r0  r)   r1   r9   r  r  r   r  r  rG  r]  r8   r*  r   )rF  
https_fmtsrz  	stream_id
pot_policyrequire_po_tokenr  fmt_urlencrypted_sigscmsg_tmplrG  fmtrh  rf  n_challengen_result)rl  r  r  rn  r  fetch_po_token_funcformat_typesr  r  rs  gvs_potsr  rc  itagsrn   player_token_providedr  r  rl  skip_bad_formatsskip_player_jsr  ri  
stream_idsstreaming_formatsr  rm  rn  process_https_formats  s   









zGYoutubeIE._extract_formats_and_subtitles.<locals>.process_https_formatsr}   r  hlsdashc                    sp    df}s|| v rdS 	dvr d<   dd u r$d d< |dkr8dkr8	d	kr8 d  d
8  < |rNt  dddd d<  d  d8  < | | |rcrc| d  d< ntfdd| D rz| d  d< n|r| d<   d}|r| krt  dddd d<  d< n|r| krt  dddd d<  d< |dv rt  dddd d<  d  d7  < 
 t dd d d<  d dkr  dr
t fddd  d< d srt  dt|d!d d<   d"r d" d
kr d"= dkr6  d#r6d$ d#<  d  d%8  < d&S )'Nr  Fr  r  r  r  rT   r  r  r   r  r  r  r     r4  r  c                 3   s    | ]	\}}| kV  qd S r  rm  )r|  rA  r  )rF  rm  rn  r    s    z\YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<genexpr>z
(original)r  r  )616235r  r  c                 S   s   | d  dd S )Nr  r4  r   )r  rm  rm  rm  rn  r  -  r  z[YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<lambda>r  r  c                    s   t |  d  S )Nr  )absr  rm  rm  rn  r  /  r  )ro  r  r  r  r  mayber  T)r  r"   r*  r  r3   r.  r\  r   )r  rF  r  r  r  ro  	lang_code)r~  r  r  r  r  r  r  rn   r  r  rl  )r  rF  rn  process_manifest_format  sT   

 
zIYoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_formatr  z6(?P<path>.+)(?P<suffix>/(?:file|playlist)/index\.m3u8)r  suffixr   z/n/r  r  r  z/pot/r  )r  r[   )r  livez/itag/(\d+)r  rg  r  r  r  z/clen/(\d+)r  z	file sizerj  r  F)+collectionsdefaultdictrU  r*   rj  r  deprecated_featurer1   r  r  r/  r0  r)   r9   r*  r]  ri  r*  r.  r+  r)  r0  rC  r1  r  r  r  r  rG  r,  r$  r   HLSr&  rstriprH  r7   #_extract_m3u8_formats_and_subtitles_merge_subtitlesr&  DASHr  r!   )"rl  r  rm  r  rn   rh   	subtitlesr  streaming_datarz  r  s_challenger  r  r  r  needs_live_processingskip_manifestsr  hls_manifest_urlmanifest_pathr7  manifest_suffixsolved_nr  r  r  r  r  subsr5  r  dash_manifest_urlr  rm  )#rl  r~  r  r  r  rn  r  rh   r  r  r  r  rs  r  r  rc  r  r  r  rn   r  r   r  r  r  r  r  rl  r  r  r  ri  r  r  r  rn  _extract_formats_and_subtitles  s8  

<







>Zs


 7




z(YoutubeIE._extract_formats_and_subtitlesc                 #   sX   t |ddddd d d }ttd| pd }|sd S t|d }t|D ]\}}|d}ttt	|d d	 }t|d
ksGt
|sY| d| dd| t   q)|\}	}
}}}|dd  \}}|dt|| d|d|  |||  } | d| ddddd|	|
|  || fddtt|D dV  q)d S )N)storyboardsplayerStoryboardSpecRendererrh  r   rg  rH   r  zhttps://i.ytimg.com/r   #r     zMalformed storyboard r   r  z$Lz$Nz&sigh=sb
storyboardr  r  c                    s0   g | ]} d t|t |  dqS )z$M)r{   rh   )r,  r!  r.  )r|  jrh   fragment_durationr{   rm  rn  r    s
    
z1YoutubeIE._extract_storyboard.<locals>.<listcomp>)r  r  rZ   r  r  r  r{   r  r  r  rowscolumnsr  )r    r  r9   r:   r  r]  rg  r  r@  r!   r  r  r  r   r,  r!  r  mathceil)rl  rm  rh   rh  base_urlLre  r  countsr  r  frame_countcolsr/  r  sighr  rm  r-  rn  _extract_storyboard  sL   
"&
zYoutubeIE._extract_storyboardc                 C   s   d }|r@d|  dvr@ddd}| j dd gddd	 p#tt|d
thf}|r*||d< | j|||t| |ddddthfid}|S )Nr0  r  
9999999999r_  )bpctrhas_verifiedr  Tr  r   r  ppz
User-Agentr  r  	userAgent)rf  r  )rj  r1   r   r!  r%  r$  )rl  r  r2  r  r0  rf  r=  rm  rm  rn  _download_initial_webpage  s   

z#YoutubeIE._download_initial_webpagec           
      C   s   t   }d}t|ddd ddddd	d
dthf
D ]T}t|dtjjhddthf}|d u r.dnd| d}t|dtddhf}	|	d urW|	d rI|	nt|	}	|d|	 d7 }|	}|d url| 	| d| d|  ||7 }q|rvt
|| S t|S )Nr   adSlotsc                 S   s   |d d d dkS )NadSlotRendereradSlotMetadatatriggerEvent!SLOT_TRIGGER_EVENT_BEFORE_CONTENTrm  r  rm  rm  rn  r    r   z7YoutubeIE._get_available_at_timestamp.<locals>.<lambda>rA  fulfillmentContentfulfilledLayoutplayerBytesAdLayoutRendererrenderingContent)N)#playerBytesSequentialLayoutRenderersequentialLayouts.rG  rH  instreamVideoAdRenderer
playerVarslength_secondsr  zan adza zs adskipOffsetMillisecondsr  r  r   z skippable after rg  z: Detected z for )r  r1   r  r/  r0  r)   r!   r   r  r  r1  r2  )
rl  rf  r  r  nowwait_secondsrt  rh   ad	skip_timerm  rm  rn  r/    s*   
z%YoutubeIE._get_available_at_timestampc                 C   s   t |d}t|d}|d u rt|d}t|d}	t|d}
t|d}|r&dn|r*dn|
r.d	n|	r2d
n	d||	fv r:dnd }| |||||^ }}tdd |D rZ|D ]}d|d< qS||||fS )N).liveBroadcastDetailsisLive	isLiveNowisLiveContent
isUpcomingisPostLiveDvrrB  r  is_upcomingr   Fro   c                 s   s    | ]}| d V  qdS )r  Nr  r  rm  rm  rn  r    s    z*YoutubeIE._list_formats.<locals>.<genexpr>Tr  )r1   r    r%  r  )rl  r  r  r  rm  r  rh   live_broadcast_detailsr  live_contentrY  rB  rn   r  r  r  rm  rm  rn  r    s&   






zYoutubeIE._list_formatsc              
   C   s   d }|rd| j vr| j||dd}t|ds| d d }|s>d| dvr>d|i}||   | j|dd||dd	|d
}|S )Ninitial_dataFr  r  zIIncomplete data received in embedded initial data; re-fetching using API.r  r  r  z!Downloading initial data API JSON)rJ  rK  r  rL  rf  rL  r   r  )ro  extract_yt_initial_datar1   r  rj  ri  rz  r[  )rl  r  r0  r2  r  r\  rf  rm  rm  rn  _download_initial_data  s   

z YoutubeIE._download_initial_datac                 C   s>   | j r|sdS t|d}t|ddkpd| |dpd v S )NF)topbardesktopTopbarRendererlogotopbarLogoRenderer)	iconImageiconTypeYOUTUBE_PREMIUM_LOGOpremiumtooltipTextr   )r  r1   r  r  )rl  r\  tlrrm  rm  rn  _is_premium_subscriber	  s   
z YoutubeIE._is_premium_subscriberc                 C   s~   |  |||}| ||p| |}| ||||}| |}	|	r&| d | | |||	|||||	\}
}||||	|
|fS )Nz%Detected YouTube Premium subscription)r?  extract_ytcfgr$  r^  ri  r  r@  r
  )rl  r{   r  r  r2  r  r0  r  r\  r  rm  r  rm  rm  rn  r    s   


zYoutubeIE._initial_extractc                    sb  t |i \}}| d }|d  }d}||||\	}}}}	}
t|	dtd}t|dtd}|rB|	 |S 	rK	fddnd	d }t|	d
td}t|	dtd}t|dddddtht
f}t|dddddtht
f}t|dddtht
fpi }t|ddddthfpi }|dp|d}|d}jr|pt|dp|p|g d}|s|rd |}|d}t|d}|d urֈjr|p|n|}|d u r|}t|	dtd}|rd|d sdd!rd" d# ngg }g }|d$D ]I}tjtj|fd%d&}|d'}|s!q|d} |}!| r2|!d(|  d)7 }!|d*d+td,|d' d- d d.i|!d/ || qd0d1| |||S tt|d2p|tt|d2p|t|d3p|d }"|||	|
|"\}#}$t|	d4}%d5kr d6 sKd7st|%d8r t|d9tdpi }&|&d:pt|d:}'t |&d;pd<}(|(r |(!d=rt|d>})|)s|d?}*|*r|*d$nd })j"|(|)d.d@ |'dA|( 7 }'|'rKdB|'# v rt$|'dC}'t$|'% dD dAj& }'n't|dEdFthfr,|'dG7 }'ndH|'v rDt$|'% dD dAj'r?dIndJ dK}'j(|'d.dL t|dMt)dpTg }+|+si	ridNdO t*+,dP	D }+|+D ]?},|,!dQrt*-dR|,}-|-rdSdT |-. D \}.}/|.d-kr|/d-kr|.|/ }0D ]}1|1dUdVkr|0|1dW< q nqk/||fdX}2|dYdZg}3|3r|2d[|3i |20 }4g d\}5t1|5}6|22fd]dT|5D  |2D ]#t3fd^dTt4|5D |6}7d_d[ v rd-nd`da|7  db< qވ5|2 j67|4 t|dcp|dd}88t9t|dep)t|dfp)|de}9t|dg}:t:t|#dh};t:t|#di}<|"sL|<rL|;rL|<|; }";|"}=d_dldm}>dnv rD ]F}?|?do}@|@dpv }Ad5kr{|Ar{|>|?dqdrds q_|=r|?dts|>|? q_dukr|@dvkr|>|? q_|Ar|>|?dwdxds q_|=r<|;|||duk 2=|	|" >|:}Bi d'd|dydz|2d{t|4d|d}|d~|9dt?|9d dd dd3|"dtt||fdp|ddt@t|ddt|ddu s|ddks|ddkrdnd-d|d|8r%|8gnd d|+dt|ddt|dr;dn	t|drCdnd|;dddddddg v rUdndUddddf
d}Cdd fdd}Dfdd}Ei }FtA }Gfddt|	dddddd fD }HdBdvoddpd}It|	dd }Jt|Jdddddthf}Kfdd|KD }Lfdd|KD }M|JD ]`}N|Nd d }O|Nd tC }P|Nd tD d d }QE|Pd }R|Nd tF }Si }Td}Ut|Oddd fD ]}V|Vd }t||V}Wt
fddTdD p|RjGo|RjHo| }X|Us5d.}U|S|Xp&|RjIdč }Yr5|TJ|Yd|QdƜ |TsH|XrH|GK|P L|P  nȈdd gd` }Zj|Vdddɍ}[|Vdʡdk}\|\ry|Wshq|D|F||W|[|P|T |Vd̡syq|HM D ]W\}]}^|]sq}|]}_|\r|]dkr|Isq}|]d|W 7 }]|^t?|[d dσ7 }^|Wd|_ kr|E|_ |D|$||] dѝ|^ dҝ|P|T |D|$||]|^|P|Z|_kr|Tnd|]i|T q}tN|WdЃ}W|\s|Wr|W|$v rqt$|[dԃ}[|Vd̡r|E|W |D|$||W dѝ|[ dҝ|P|T |D|$||W|[|P|T q|LO|F |MO|$ |Ls"|Ms" nq|GrQ|Ls-|MrQjLd.tP d՝|LoAdd1|L dD|MoKdt1|M d؝ddڍdۍ |$|Cd< |F|Cd< tjQ|}`|`jR|`jSfD ]1}atj|a}b|bM D ]#\}c}ddD ]\}e}f|ed7 }e|e|Cvr|c|fv rt|dd- |C|e< qwqqqe|pd<% Tdrt*-d|}-|-r|-Ud}g|-Ud}h|hr|hVdd<}h|gs|hd d }g|CJ|-Ud% |-Ud }ir|ignddO |-UddD |-Ud% |ht|gd d t|dd fddddddfjWdd|Cd< z|d d d d d d- d d  W n tXtYtZfy-   Y nw d dddv r<dnd dg|C[di d< |ro\||"pc]||"pc^||"pcd |Cd< _||Cd< t|dt)g d}jt|jd}k|krx|kd}l|lrĈ|l}lt`|kd	d d
kr|l|Cd< n"t*-d|l}-|-r|CJ|-Udȡta|-Udata|-Udd t`|kdd t)pg D ]Z}mtbt|mdd}n|nD ]J}odd dfdd dd gdffD ]1\}p}qt`|o|ptpi d}r|rr%t*c|q|r}-|-r%td|-Ud|C|-Udd <  nqqސqt|kdddddddd d d!d"d#tehfdd$|Cd%< t|kd&}s|srxW|sd'}t|sd(rl|t|Cd)< n|Cdd u rx|t|Cd< t|jd*}u|u	rxt|ud+}vt|vd,d-dd.d/d0d1d2d3d4d5d6dd7ddthf}w|CJ|vdp|wr|wd- nd W|vd8|wr|wnd d9 |Bs>t|vd:d;thfdd$}Bt`|ud<d t)pg }xd}y|xD ]}zt`|zd=d d.u 	rd.}y nq|xD ]\}z|zd>	pi }{|{d}|||	s	q|{d}||{d?}}||d@k	r4|}|CdA< 	q|y	s`||dBk	rC|}|Cd< 	q||dCk	rV|}	rO|}gnd |CdD< 	q||dEk	r`|}|Cd< 	qft|udF}~g|~thji	rxd.|CdG< |CJ|CdH|Bt?|Bd dId ddJ t:t|dKtjdL	pt:|dKtjdL}|	rtkjlm|tkjnjopdMntqt|dK	ptq|dK}|	r|	sވdNv 	rtrs|kdO	p|}||CdP< ||CdQ< |
rdRv
rtt|jVtkjnjodS}|ttdTk
r|Cdy D ]}?|?dodUk
rd.|?dV< 
qdWD ]\}}e|C|}d|d
r-|d|C|e< 
qft|kdX}g|thju
pGt|dYtvd}g|thjw
rSdZnGjx||
rh|d u
rhg|thjy
pgdnd |
r{|d u
r{g|thjz
pzdnd |Cd dk|d u 
rd ng|thj{
pt|d[tvdd\|Cd]< |||j	|Cd^< }|	 |CS (`  Nz//www.youtube.com/zwatch?v=rS   ).r  r  )errorScreen%playerLegacyDesktopYpcTrailerRenderertrailerVideoIdc                    s    j | d dS )Nrg  )_html_search_metar  )rl  r0  rm  rn  r  ;  r  z)YoutubeIE._real_extract.<locals>.<lambda>c                 S   s   d S r  rm  r  rm  rm  rn  r  <  s    r  r  r  .r  r  $structuredDescriptionContentRendererr3  &expandableVideoDescriptionBodyRendererattributedDescriptionBodyTextvideoDescriptionHeaderRendererr|  r}  r  !playerOverlayVideoDetailsRendererr\   ).r\   )zog:titleztwitter:titler\   zoNo title found in player responses; falling back to title from initial data. Other metadata may also be missing).rg   shortDescription)multicameraplayerLegacyMulticameraRenderermetadataListforce_singlefeed
noplaylistzDownloading just video z because of --no-playlist,c                    s   t  fddtS )Nc                    s   |   d S )Nr   rm  r  rC  rm  rn  r  {  r  z=YoutubeIE._real_extract.<locals>.feed_entry.<locals>.<lambda>)r3   r!  r{  )	feed_datar{  rn  
feed_entryy  s   z+YoutubeIE._real_extract.<locals>.feed_entryrX   z (rI  url_transparentYoutubez{}watch?v={}r   T)_typer  r{   r\   zNDownloading multifeed video ({}) - add --no-playlist to just download video {}r  lengthSecondsrh   ).r  rB  z): Video is in Post-Live Manifestless modeallow_unplayable_formats).licenseInfos)rk  playerErrorMessageRendererr  	subreasonr   z>The uploader has not made this video available in your countryavailableCountriesregionsAllowed)metadata_availablez. zsign inz,This helps protect our community. Learn morer  rk  playerCaptchaViewModelz:. YouTube is requiring a captcha challenge before playbackz-This content isn't available, try again laterr  r  a   has been rate-limited by YouTube for up to an hour. It is recommended to use `-t sleep` to add a delay between video requests to avoid exceeding the rate limit. For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#this-content-isnt-available-try-again-laterrO  keywordsc                 S   s   g | ]	}t |d qS )r  )r4   r  )r|  r7  rm  rm  rn  r    s    z+YoutubeIE._real_extract.<locals>.<listcomp>zog:video:tagzyt:stretch=z(\d+)\s*:\s*(\d+)c                 s   s    | ]}t |V  qd S r  )rh  )r|  r~  rm  rm  rn  r    r  z*YoutubeIE._real_extract.<locals>.<genexpr>r  r  r   )..rt   zog:imageztwitter:imager{   )maxresdefaulthq720	sddefault	hqdefault0	mqdefaultrh  sd1sd2sd3hq1hq2hq3mq1mq2mq3r_  r^  3c              
   3   sJ    | ] }d D ]}ddj |||dkrdnd dkrdnddiV  qqd	S )
)webpjpgr{   z:https://i.ytimg.com/vi{webp}/{video_id}/{name}{live}.{ext}r  _webpr   r  _live)r  rC  rZ   r  r  N)r   )r|  rC  rZ   )rn   r  rm  rn  r    s    c                 3   s0    | ]\}}d  d |  d v r|V  qdS )r  r{   Nrm  )r|  re  t)thumbr  rm  rn  r    s   . z.webpr  r  r  categorygenrer  externalChannelIdownerProfileUrlstartTimestampendTimestamp(Last 2 hours)rw  c                 S   s2   |  dpd| | d< t|  d|dd| d< d S )Nr  r  r  r  r  )r  r"   )r  note_suffixpref_adjustmentrm  rm  rn  adjust_incomplete_format  s   z9YoutubeIE._real_extract.<locals>.adjust_incomplete_formatr  r  )Nhttpr  z(ended)ix)r  r  r  r  r  z(incomplete)ir  r  rt   )r  r{   rg   rc   re   z"https://www.youtube.com/channel/%srg  rz   ).	viewCountinteractionCountaverage_ratingaverageRatingr]   isFamilySafeFisFamilyFriendlyr  zog:restrictions:agez18+r   r  r`   rs   rq   playableInEmbedrn   rV  r   isShortsEligibler  rJ   r  resr  zhdr:12sourcezprefer-vp9-sortcompat_optszvcodec:vp9.2channelsr  r#  rF  )r   r   _format_sort_fieldsc                 S   s&   t | dpddddp| dS )NvssIdr   r  r4  languageCode)r,   r  r,  )r   rm  rm  rn  get_lang_code@  s   z.YoutubeIE._real_extract.<locals>.get_lang_codec                    sX   |  |g } jD ] }i ||g d}|d|dtdt||d|ddt|i q	d S )N)r  xosfrZ   r{   r  rC  rb  T)r(  _SUBTITLE_FORMATSr   r:   r8   r)  )r  r3  r  sub_namer  rf  	lang_subsr  rk  rm  rn  process_languageD  s   
z1YoutubeIE._real_extract.<locals>.process_languagec                    s.    D ]}| ddkr| ds| |d< qd S )Nr  r  r  r  )r  r  )r  rm  rn  "set_audio_lang_from_orig_subs_langR  s
   zCYoutubeIE._real_extract.<locals>.set_audio_lang_from_orig_subs_langc                    s$   i | ]}|d   j |d ddqS )r  languageNamer   rR  r  )r|  r#  rk  rm  rn  r  [  s    z+YoutubeIE._real_extract.<locals>.<dictcomp>captionsplayerCaptionsTracklistRenderertranslationLanguagesc                 S   s   |d o|d S )Nr  r  rm  r  rm  rm  rn  r  _  r  translated_subsr}   rJ  rK  c                 S   s   |d o	|d d S )Nr  r  r  rm  r  rm  rm  rn  r  g  r   captionTracksc                    s"   h | ]}| d dkr |qS )kindr  r  r|  r5  r  rm  rn  	<setcomp>j  s   " z*YoutubeIE._real_extract.<locals>.<setcomp>c                    s(   h | ]}| d dkrt |dqS )r  r  a-)r  r,   r  r  rm  rn  r  k  s    r  r  
clientNameSUBS_PO_TOKEN_POLICYc                 S   r'  )Nr[  rm  r  rm  rm  rn  r  y  r  r[  c                 3   s    | ]
}|t  d v V  qdS ))exp.Nr  )r|  rh  )r  rm  rn  r    s    )xpexpvr  r_  )r  potcr  rC  r   rR  r  r  isTranslatableundr4  z from %sr  z-origz (Original)tlangz (auto-generated)zL: There are missing subtitles languages because a PO token was not provided.z+Subtitles for these languages are missing: zAutomatic captions for z languages are missing.r  r  )rG  automatic_captionsr  ))r  )r  r  )end)r  _timez
Auto-generated by YouTube.u  (?xs)
                    (?:\n|^)(?P<track>[^\n·]+)\ ·\ (?P<artist>[^\n]+)\n+
                    (?P<album>[^\n]+)\n+
                    (?:℗\s*(?P<release_year>\d{4}))?
                    (?:.+?\nReleased\ on\s*:\s*(?P<release_date>\d{4}-\d{2}-\d{2}))?
                    (?:.+?\nArtist\s*:\s*(?P<clean_artist>[^\n]+)\n)?
                    .+\nAuto-generated\ by\ YouTube\.\s*$
                r   r      r   clean_artistc                 S   s   g | ]}|  qS rm  )r  )r|  arm  rm  rn  r    r   r   u    · r   )r   r   r   r   r   )rq  z!engagement-panel-comments-section)r  twoColumnWatchNextResultsr  r  r  .rs  r  . commentsEntryPointHeaderRenderercommentCountc                    s   |d d  v S )Nr  panelIdentifierrm  r  )COMMENTS_SECTION_IDSrm  rn  r    r  header"engagementPanelTitleHeaderRenderercontextualInfor  rf   r  r  conversationBarliveChatRenderercontinuationsreloadContinuationDatar`  z https://www.youtube.com/watch?v=z &bpctr=9999999999&has_verified=1json)r  rY  youtube_live_chatyoutube_live_chat_replay)r{   r  rZ   r  	live_chatr   rl   )r  r  r  r  r  r  videoPrimaryInfoRenderersuperTitleLinkc                 S   r#  )NsuperTitleIconrd  rm  r  rm  rm  rn  r    r  LOCATION_PINrZ  u   (.+?)\s*S(\d+)\s*•?\s*E(\d+)r   )seriesseason_numberepisode_numberc                 S      | d d d S )NvideoActionsmenuRenderertopLevelButtonsrm  r  rm  rm  rn  r  *  r  )toggleButtonRenderer.)"segmentedLikeDislikeButtonRenderer.r  c                 S   r  )NdefaultTextaccessibilityaccessibilityDatarm  r  rm  rm  rn  r  2  r  z*(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)c                 S   r  )Nr  rm  r  rm  rm  rn  r  4  r  c                 S   s   | d d S )Nr  rm  r  rm  rm  rn  r  5  r  zK(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other peoplerp  rX  r  _countr  r  r  #segmentedLikeDislikeButtonViewModellikeButtonViewModeltoggleButtonViewModeldefaultButtonViewModelbuttonViewModelaccessibilityTextr  rm   )r  videoViewCountRendererr  rT  r  videoSecondaryInfoRenderer)ownervideoOwnerRendererattributedTitlecommandRunsonTapr  showDialogCommandpanelLoadingStrategyinlineContentdialogViewModelcustomContentlistViewModel	listItemslistItemViewModelsubscriberCountText)ra   rb   r   )navigationEndpoint)r\   runs.r  )r  r  c                 S   r  )NmetadataRowContainermetadataRowContainerRendererr/  rm  r  rm  rm  rn  r  c  r  c                 S   r#  )NmetadataRowRendererhasDividerLinerm  r  rm  rm  rn  r  g  r  r  )r  r   Licenser   AlbumArtistr   Song)r  r  r  r   ra   zhttps://www.youtube.com/%s)rw   rx   ry   
uploadDate)timezonez%Y%m%d)ro   NdateTextrv   ru   )r  rB  rY  )tzinfoztoday-2daysm3u8_native__needs_testing))r   r   )r   r   r  	isPrivater_   
isUnlisted)
is_privateneeds_premiumneeds_subscriptionr   is_unlistedr^   __post_extractor)r  rw  )~r6   	_match_idhttp_schemer  r1   r  r    r!  rt  r  r  r  _preferred_langr  r  r\  r  r  r/  r0  r)   unquote_plusr   r-   r   r  playlist_resultr!   r'   r  r  
report_drmr   r  raise_geo_restrictedr  r+   r  r1  r  raise_no_formatsr  r  finditer_meta_regexr  groups_extract_thumbnailsr  r]  r  r  rg  _remove_duplicate_formatsr  _sort_thumbnailsr  r.   r(   rC  r  r9  handle_from_urlr   r   rU  rj  r)  r,  r$  r-  r  rp  r&  ri  r*  rM  r3  r,   r  r"   r1  fragmentrf  endswithr  r,  r  KeyError
IndexError	TypeErrorr(  r  r  "_extract_chapters_from_descriptionr  r3   r  r;   r  r/   r&   r  r  r   r  r   dtdatetimefromtimestampr  utcstrftimer5   r0   r  r   AVAILABILITY_PRIVATEr  AVAILABILITY_PUBLIC_availabilityAVAILABILITY_PREMIUMAVAILABILITY_SUBSCRIPTIONAVAILABILITY_UNLISTEDextract_commentsmark_watched)rl  r{   r  r3  r  r2  r  r\  r  rm  r  playability_statusestrailer_video_idsearch_metar  r  initial_sdcrinitial_descriptioninitial_vdhrinitial_video_details_rendererinitial_titletranslated_titlevideo_titletranslated_descriptionoriginal_descriptionvideo_descriptionmultifeed_metadata_listentriesfeed_idsfeedr}  feed_id
feed_titler\   rh   rZ  r  r  pemrr  r  	countriesregions_allowedr  keywordrx  whratior  r  thumbnail_urloriginal_thumbnailsthumbnail_namesn_thumbnail_namesre  r  rc   owner_profile_urlr  live_end_timer  r  r  r  is_adaptivechannel_handler  r  r  r  skipped_subs_clientstranslation_languagesget_translated_subsr  all_captionsneed_subs_langsneed_caps_langsr  pctrr  innertube_client_namer  r=  
pot_paramsalready_fetched_potcaption_trackr  requires_potsubs_po_token	orig_lang	lang_nameis_manual_subs
trans_code
trans_nameorig_trans_coderq  	componentrf  r}  r~  d_ks_ksr   r   r  r  vpirstltlbtbrsr  getterregexrp  vcrvcvsirvorcollaboratorsr/  multiple_songsrowmrr	mrr_titlemrr_contents_textowner_badgesru   rv   upload_datetimes_kr  r%  rm  )
r  r|  r  r  rn   r  rl  r  r  r0  rn  _real_extract%  s  









 











$&







	


$










	

	
(
	



"




	 




 
 
zYoutubeIE._real_extractr  )T)NFr  )NNr   )T__name__
__module____qualname__IE_DESCr   r  r   _INVIDIOUS_SITES
_VALID_URL_EMBED_REGEX_RETURN_TYPEr  r  r  r  r  _GEO_BYPASSIE_NAMEr  r!  _TESTS_WEBPAGE_TESTSpropertyro  r  r  r  r3  r2  classmethodr  r  r  r  r  r  r  r#  r)  r  r6  r  r;  rG  rI  rO  rs  rv  r{  r  r  r  r  r  r+  staticmethodrW  rw  rz  r  r	   r  r  r  r  r  r  r  r
  r  r@  rC  rH  rM  r%  r9  r?  r/  r  r^  ri  r  r  __classcell__rm  rm  r  rn  rF   T   s    
$	
!-	
L	
q	
 	
  :	
  [	
  z	
       	
    A	
    b	
           
	
      )	
      O      T      W      Z      b	
                              	
        6	
        X        ]        b        n	
                             "          %          (          ,          0          5          ;
	

!          _          d
          s	
           	
            7            :            >
	

"            d            h	
             
	
              '              +              /              3	
              Z              _              b	
               		
                )	
                M	
                m	
                 	
                  *	
                  J                  N	
                  t	
                   	
                     =	
                    g	
                     
	
#                      .	

                      M	
                      n	
                       	
                        8	
$	
#	
$	
%  7o-#)
1 Y$Z6+5 #    &rF   )\rk  r  r  r@  r?  r  r,  r1  rR  r  r>  r  r  urllib.parser/  _baser   r   r   r   r   r   r	   r
   r   jsc._builtin.ejsr   jsc._directorr   jsc.providerr   r   r   r   pot._directorr   pot.providerr   r   networking.exceptionsr   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   r3   r4   r5   r6   r7   r8   r9   r:   r;   utils.networkingr<   r=   r>   r)  r-  r*  r+  r,  r.  r0  rE  rF   rm  rm  rm  rn  <module>   s>    ,'