o
    j_U                    @   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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/d0d1d2d3d4d5d6dd7d8ed9
d:d;d<d=d>dd?d@dAdBdCdDdEdFdGi 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/d0dHd1d3d4d5d6dd7d8edId:dEdJdKi ddLddMddNddddddgddOd ed!dPd#dQd%ed&dRd(dSd.ed/d0dTddHd1dUd4dVd6dOdWdXedIdYd1d1dZd[d\d]i dd^ddMdd_dddddd`gddad ed!dbdcd1d#ddd%ed&ded(dfd,d-d.ed/d0dd1dgd4dhdidadjdkedl
dmd1d1dZdndodpi ddqddddrdd@ddsddtgddud ed!dvdcd1d#dwd%ed&dxd(dyd,d-d.ed/d0dd1dzd4d{d|dud}d~edl
dd1idd\ddi ddddddddddddgddd ed!ddcd1d#dd%ed&dd(dd,d-d.ed/d0dd1dd4dddddedl
dd1idddi dddddddd@ddsddgddd ed!dd#dd%ed&dd(dd.ed/d0dTddHd1dd4dddddedIddE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/d0dTddHdddd4dddddeddddd1ddi dddddddddddd`gddd ed!ddcd1d#dd%ed&dd(dd,d-d.ed/d0dd1dd4dddddedl
dgdd1iddi ddddddddddddgddÓd ed!dēdcd1d#dœd&dƓd(dǓd.ed/dȓdTdɓdHd1dddd4dddddedќ
dd1idn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/d0dTddHd1ddd4ddddded	dd1idndd1d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/d0dTddHd1ddd4dddddeddd1idn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ȓdTdɓdHd1dddd4ddddd edќ
dd1d1dZdndd1ddd1ddd1ddd1d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/d0dTddHd1dd4ddd
ddedIdd1idndd1dddddddddd;dd1d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/d0dTdd1d*d4d+d,d!d-d.ed/	dd1idnd0i dd1dddd2dddddd3gdd4d ed!d5dcd1d#d6d$dd%ed&d7d(d8d,d-d(d)ed0dd1dd4d9d:d4d;d<ed=dd1idnd>d1dd?d1dd@dAddBdCdDdEdFdGd;dHi ddIddddJddddddgddKd ed!dLdcd1d#dMd%ed&dNd(dOd,d-d.ed/d0dd1dd4dPdQdKdRdSedl
dTgdd1iddUdVddWdXdYdZd[d\d;d]d1dd^d1dd_d1dd`d1ddad1ddbd1ddcd1dddi ddeddddfdddgdhdidfdjdkgdddd`gddkd ed!dldcd1d#dmd%edndkgd&dodpd-ed0dd1dqdd4drdfdsdkedtdd1idndud1ddvdwddxdydzd{d|d}d~d:d;di ddddddddddddgddd ed!dd#dd&dRd(dd.ed/d0dTddHd1dg d4dddddeddd1idndi dddddddddddd gddd ed!ddcd1d#dd$d%d%ed&dd(dd,d-d.ed0dd1dd4dddddeddd1idndd1ddd1ddi dddddddddgddiddjdgdddd`gddd ed!ddcd1d#dd%edndgd&ddd-ed0dd1ddd*d4ddddeddd1idndd1ddi dddddddd@ddsdd3gddd ed!ddcd1d#dd%ed&dd(dd.ed/d0dTdd1dd4ddddded/	dd;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/d0dTddHd1dddd4dddddeddd1idndd1ddd1ddd1ddi ddƓddǓddȓddddddgddɓd ed!dʓdcd1d#d˓d$d%d%ed&d̓d(d͓d,d-d.ed0dd1dd4dϐdАdɐdѐdedddӐdgiidd1d֜dאd؜ddd1dddڐdgiiidܜdd1ddސdi dddddddddddd gddd ed!ddcd1d#dd$dd%ed&dd(dd,d-d.ed0dd1dd4dddddeddd1dddi ddddddddddddtgddd ed!dd#dd%ed&dd(dd,d-d.ed/d0dTdd1dd4ddddded/	dd1idndi ddddddddddddgddd ed!ddcd1d#dd%ed&d d(dd,d-d.ed/d0dd1dddd4dddddeddd1idndi dddddedddddd`gdd	d ed!d
dcd1d#dded&dd.ed/ddTdɓdHd1dddd4ddd	ddedќ
dd1idndi ddddddddddՓdd`gddd ed!dd#dd&dRd(dd.ed/d0dTddHd1dg d4ddddd eddd1idnd!i dd"dddd#ddddՓddgdd$d!d%d#d&d&dRd(d'd.ed/d0dTddHd1dg dd4d(d)d$d*d+eddd1idn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/d0dTddHd1dg dd4d0d1d$d*d+eddd2d3giid1d4d5gd6d7d8d1dd9d:i dd;dddd<ddddddgdd=d ed!d>dcd1d#d?d%ed&d@d(dAd,d-d.ed/d0dd1g d4dBdCd=dDdEedl
ddӐdFgiidGd1d֜dHd\dIdJi ddddKdddd@ddsddgddd ed!dd#dd%ed&dd(dd.ed/d0dTddHd1dd4dddddedIdLd1ddd\dMdNi ddOddddPddddddgddQd ed!dRdcd1d#dSd$dd%ed&dTd(dUd,d-d.eddd1dVdWdd4dXdVdQdYdZed[dd1idd\i dd]ddKdd^dddd_d ed!d`dcd1d#dad$dd%ed&dbd(dcd,d-d.ed/d0dTdd1dUd4ddded_dfdged/	ddFgdhgdiid1d4dHd؜dji ddkddddlddddddgddmd ed!dnd#dod&dRd(dpd.ed/d0dTddHd1dg d4dqdrdmdsdteddd1idndui ddvddddwdjdxgdydwdgdzd{d|d}d~didwd&ddTdddddd!dd#ddcd1d eeeedddd-d`gg ddxgddd1dd0ddd1idndi ddddddd&ddTd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dd1dd0ddd1idndi ddddddd&ddTd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dd1dd0d
dd1idndi ddddddd&dRdTd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dd1dd0dddd1d1ddndi ddddddd&dRdTd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dd1dd0d+ddÜd1d1ddnZdi ddœddddƓdǐdȓd&dɓddddUd!dʓdHd1dd4d.ed%edd˓d/d0d#d̓ddd(d͓edgedːdΐdd-dddќ	dd1idn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/d0dTddHd1dd4dڐdېdՐdܐdedIdd1idn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&dRd(dd.ed/d0dddTdd1dd4ddddded/	dd1idn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/d0dTddHd1ddd4dddddeddddgiid1d4dndddddd dd)dd1idgZdZdZddddd	d
ddddddZdd e D Zejdd Zejdd Z ejd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,d0d1 Z-e"d2d3 Z.dd4d5Z/dd6d7d8Z0dd6d9d:Z1dd;d<Z2d=d> Z3e" fd?d@Z4e"dAdB Z5dCdD Z6dEdF Z7dGdH Z8ddIdJZ9ddKdLZ:ddMdNZ;e<dOdP Z=dQdR Z>e<dSdT Z?e"ddUdVZ@dWedXeAfdYdZZBd[eAjCd%d%d%d%d%d%d%df
dXeAfd\d]ZDd^d_ ZEe<d`da ZFe<dbdc ZGddde ZHdfdg ZIdhdi ZJdjdk ZKdldm ZLdndo ZMddpdqZNdrds ZOdtdu ZPdvdw ZQdxdy ZRddzd{ZSd|d} ZTd~d ZUdd ZVdd ZW  ZXS (  	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_safari)rR   )tv_downgradedrS   )rT   web_creatorwebrS   rS   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)rY   r[   r]   r^   rh   rw   zPrivate video)noter|   r}   r~   z!Use the first video ID in the URLz9https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQrr   )rt   ru   rv   rw   rx   ry   rz   r{   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   rr   rt   ru   rv   rw   rx   ry   rz   r{   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   rt   iQ20130730z
@HerrLurikz"https://www.youtube.com/@HerrLurik)ru   rv   rw   rx   ry   rz   r{   )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_timestamprt   ru   rv   rw   rx   ry   rz   r{   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_ratiort   ru   rv   rw   rx   ry   rz   r{   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)rY   r[   r]   rh   rw   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)	rr   rt   ru   rv   rw   rx   ry   rz   r{   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)rn   ro   r   rr   rt   ru   rv   rw   rx   ry   rz   r{   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)rY   r[   r]   rh   rw   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)rY   r[   r]   rh   ri   rw   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)ri   rm   rn   ro   r   rr   r   rt   ru   rv   trackrw   rx   r{   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))rY   r[   r]   rh   rw   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)ro   r   rr   rt   ru   rv   rw   rx   ry   rz   r{   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)ri   rm   rn   ro   r   rr   r   release_yearrt   ru   rv   r   rw   rx   r{   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  ru   i ڷ_20201120z@walkaroundjapan7124z,https://www.youtube.com/@walkaroundjapan7124)rv   rw   rx   ry   rz   r{   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   rr   r   r   rt   ru   rv   rw   rx   ry   rz   r{   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)ro   r   rr   r   r   rt   ru   rv   rw   rx   ry   rz   r{   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:bfc0e2b3cc903a608d8a85a13cb50f95rx   u   half•aliveUCYQrYophdVI3nVDPOnXyIngz8https://www.youtube.com/channel/UCYQrYophdVI3nVDPOnXyIng   z:https://i.ytimg.com/vi_webp/DbCvuSGfR3Y/maxresdefault.webp)r7  r8  r6  i}c20221201)rg   r{   rn   r^   ri   ru   rm   ra   rt   r   rv   rw   rr   r_   ro   z+https://www.youtube.com/watch?v=brhfDfLdDZ8brhfDfLdDZ8z/This is the WORST Movie Science We've Ever Seenz$md5:8afd0a3cd69ec63438fc573580436f92
Open Saucery   z@opensauceliverz   z&https://www.youtube.com/@opensauceliveUC2EiGVmCeD79l_vZ204DUSwz8https://www.youtube.com/channel/UC2EiGVmCeD79l_vZ204DUSwr{   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)ra   rt   r   rv   rw   rr   r_   ro   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)rC  HACHIu   焔魔るり CH. / Ruri Enmau   瀬戸乃ととu   水瀬 凪/MINASE Nagiii20251031)
ra   rt   r   rv   rw   r   r   rr   r_   ro   z+https://www.youtube.com/watch?v=f6HNySwZV4cf6HNySwZV4cdlptestvideo2z4https://i.ytimg.com/vi/f6HNySwZV4c/maxresdefault.jpgiUe20240308   zcount:15)ra   rt   rv   rw   r   r   rr   r_   ro   rg   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)rt   rv   rw   rr   r_   ro   rg   rK  zehttp://www.improbable.com/2017/04/03/untrained-modern-youths-and-ancient-masters-in-selfie-portraits/zmsN87y-iEx0z!Feynman: Mirrors FUN TO IMAGINE 6rw   20080526z$md5:873c81d308b979f0e23ee7e620b312a3zUCCeo--lls1vna5YJABWAcVAzChristopher Sykesz8https://www.youtube.com/channel/UCCeo--lls1vna5YJABWAcVA   z6https://www.youtube.com/@ChristopherSykesDocumentariesz@ChristopherSykesDocumentariesi :H)	r{   ra   rc   rx   rz   ry   rm   rv   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)rY   r]   r^   rh   ru   )r|   r}   playlist_countr   actualmainz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)rg  tcctcees5es6es6_tcces6_tcetvtv_es6phonehousec                 C   s   i | ]\}}||qS  rr  .0kvrr  rr  R/home/kuhnn/.local/lib/python3.10/site-packages/yt_dlp/extractor/youtube/_video.py
<dictcomp>e  s    zYoutubeIE.<dictcomp>c                 C   s   |  dd gd p| jS )Nplayer_js_versionr   )_configuration_arg_DEFAULT_PLAYER_JS_VERSIONselfrr  rr  rw  _player_js_versiong  s   zYoutubeIE._player_js_versionc                 C   sD   |  d| jgd }|| jvr | jd| d| j dd | j}|S )Nwebpage_clientr   zInvalid webpage_client "z" requested; falling back to T	only_once)rz  _DEFAULT_WEBPAGE_CLIENT_WEBPAGE_CLIENTSreport_warning)r}  r  rr  rr  rw  _webpage_clientk  s   
zYoutubeIE._webpage_clientc                 C   s&   t | d}| jdkr|d |S )Nwebpage_skiprf  player_response)setrz  r~  add)r}  skippedrr  rr  rw  _skipped_webpage_datau  s   

zYoutubeIE._skipped_webpage_datac                    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__rr  rw  r  }  s
   zYoutubeIE.suitablec                    s(   t  j|i | i | _i | _d | _d S N)r  __init___code_cache_player_cache_pot_director)r}  argskwargsr  rr  rw  r    s   
zYoutubeIE.__init__c                    s"   t    t| | _t| | _d S r  )r  _real_initializer   r  r   _jsc_directorr|  r  rr  rw  r    s   

zYoutubeIE._real_initializec                    s   t  t dd  D   	fdd fdd} D ]1}	|	d< tj|	d |	d	 || oB|	 }
rO|
|	d
< d|	d< q)t|
i |	d
< |	d= q)d S )Nc                 S   s   g | ]	}| d r|qS )is_from_startr  rt  frr  rr  rw  
<listcomp>  s    z>YoutubeIE._prepare_live_from_start_formats.<locals>.<listcomp>c           	         s~   t   | kr
d S j\}}}}}}t|dtd}t|dtd}||||\}} }|dkt   d S )N.videoDetailsexpected_type.microformatplayerMicroformatRendererr  )time_initial_extractr  r1   dict_list_formats)	itagclient_namedelay_prs
player_urlvideo_detailsmicroformatsro   )formatsr  r}  smuggled_datars   r|   video_idwebpage_urlrr  rw  refetch_manifest  s   zDYoutubeIE._prepare_live_from_start_formats.<locals>.refetch_manifestc              	      s   j ddD ]N}  | W d   n1 sw   Y  t fddD d}|sBs8 d|_n	d t  |_q|dsJ dS |d |d	 f  S dS )
zZ
            @returns (manifest_url, manifest_stream_number, is_live) or None
            FfatalNc                 3   s0    | ]}| d kr| d kr|V  qdS )_itag_clientNr  r  r  r  rr  rw  	<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  r  retryr  )r  r  lockr  r}  r  r  rw  mpd_feed  s   
z<YoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feedr  r  r  	fragmentshttp_dash_segments_generatorprotocolr  )	threadingLockr  	functoolspartial_live_dash_fragmentscopyr   )r}  r  r  live_start_timer|   r  r  r  r  r  genrr  )
r  r  r  r  r}  r  rs   r|   r  r  rw   _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yy   d }Y nw t|dd d u r
d7 
d }qSn|d
dk\}
d7 
|sqS|krd }qS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 qSw rd S ttd|| t   sVd 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,Tr  NNc           	         s  	} dd }|p|ot|to|jdk} |rdndp$	df\	| s:|r2s2dfS |	kr:dfS r?}n/zj	d dddd\}}W n tyX   d }Y nw |sc
d7 
dfS tfd	d
|D }|d |d szJ tt	dd d 
d}d|fS )N
last_errori  r   iPF  FTr   errnoter     c                 3   s     | ]}|d   kr|V  qdS )r  Nrr  )rt  x)stream_numberrr  rw  r    s    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r  ctxr  r  r  r  last_seqmanifestless_orig_fmtr  mpd_urlno_fragment_scorer}  r  rr  rw  _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  rr  rr  rw  <lambda>  s    z0YoutubeIE._live_dash_fragments.<locals>.<lambda>r  rJ  r   r  ri   zbreaking out of outer loopzsq/)r|   fragment_countr   )r  r  r  r   write_debug_request_webpager   r3   maxr  ranger:   sleep)r}  r  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  rr  r  rw  r    s   
$ 



zYoutubeIE._live_dash_fragmentsc                 C   sD   | j dkrdS td| j s| jd| j  ddd dS | j dS )	Nrf  r  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  @)r~  r  	fullmatchr  splitr|  rr  rr  rw  _get_player_js_version7  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   rf  z Invalid player JS variant name "z " requested. Valid choices are: , Tr  rg  https://www.youtube.com
/s/player//z	Forcing "z" player JS variant for player zoriginal url = z	
        delim)_extract_player_infor  rz  _DEFAULT_PLAYER_JS_VARIANT_PLAYER_JS_VARIANT_MAPr  joinr  r:   _get_player_id_variant_and_pathr"   )r}  r  r  force_player_idplayer_id_overridevariantactual_variantrr  rr  rw  _construct_player_urlA  sN   


zYoutubeIE._construct_player_urlr1  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#  )r}  r1  ytcfgsr  rr  rr  rw  _extract_player_urln  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)r}  r  r  r   iframe_webpageplayer_versionrr  rr  rw  _download_player_urlv  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replacers  player_pathrr  rw  r    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  )r}  r  r  r!  rr  r5  rw  r    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+   )r}  r  r  r!  r6  rr  rr  rw  _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,})/rY   zCannot identify player )r  r  r  r   )r  r  mrr  rr  rw  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  )r>  r  _download_webpager  )r}  r  r  r  player_js_keycoderr  rr  rw  _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)r>  mapr.   r  cacheloadr"   )r}  namer  rE  
cache_keyscache_iddatarr  rr  rw  _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 )NrF  r   r   )r>  rH  r.   r  rI  storer"   )r}  rN  rK  r  rE  rL  rM  rr  rr  rw  _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  rO  rC  r.  rQ  )	r}  r  r  ytcfgr  player_sts_overriderS  	error_msgrB  rr  rr  rw  _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)rt  r  CPN_ALPHABETrr  rw  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  r7  r8  r9  r)   rn  r)  floatr  update
urlunparse_replace	urlencoder@  )r}  r  player_responsesri  is_fullkeylabelr|   
parsed_urlr  video_lengthrr  r\  rw  _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|   r1  mobjid_r?  r  rr  rw  r~  
	  s    zYoutubeIE._extract_from_webpagec                 C   s    |  |}|std| |S )NzInvalid URL: )get_temp_idr   )r  r|   r  rr  rr  rw  
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   chapterrr  rr  rw  r  2	  s    
z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>c                 S   s   t | dtdS )N)r  r]   
simpleTextr  )r1   r)  r  rr  rr  rw  r  4	  s    )start_functiontitle_functionri   )r1   r  _extract_chapters_helper)r}  rN  ri   chapter_listrr  rr  rw  _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  r|  rr  rw  r  =	      zCYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<lambda>c                    s     | dS )Nr]   r  r  r|  rr  rw  r  >	      c                 3   s&    | ]} t|d  V  qdS )).macroMarkersListItemRendererN)r  r1   )rt  r  chapter_timechapter_titleri   r}  rr  rw  r  @	  s    
zDYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<genexpr>)r1   r  r  filter)r}  rN  ri   content_listrr  r  rw  '_extract_chapters_from_engagement_panel8	  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_HEATMAPrr  r  rv  rr  rr  rw  r  H	  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  rr  rr  rw  r  K	  s    intensityScoreNormalized)rs   rk   value)r1   r   )r}  rN  rr  rr  rw  _extract_heatmapE	  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)rY   parentr  toolbarlikeCountA11yauthor	channelIddisplayNameavatarThumbnailUrl	isCreator
isVerifiedchannelCommandinnertubeCommandbrowseEndpointcanonicalBaseUrlcommandMetadatawebCommandMetadatar|   r  )textrn   	author_idr  author_thumbnailauthor_is_uploaderauthor_is_verified
author_urlFr(  
heartStateTOOLBAR_HEART_STATE_HEARTED)is_favorited
_time_textrv   )r    r  r1   r)  r&   ucid_or_noner9   boolr:   r  _parse_time_text)r}  entitiesr  comment_entity_payload
comment_idtoolbar_entity_payload	time_textrr  rr  rw  _extract_commentO	  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  )rY   r  rn   r  r  r  r  publishedTimeTextr   )r  rv   r  )r  r  Fr  r(  r  authorIsChannelOwnerr  )actionButtonscommentActionButtonsRendererr  creatorHeartr  authorCommentBadgeTr  pinnedCommentBadge	is_pinned)r  r  
_get_countr1   r  r9   r  rq  r:   r)  r  _extract_badges
_has_badger   VERIFIED)r}  comment_rendererr  r  infor  rv   r  comment_abrbadgesr  rr  rr  rw  _extract_comment_oldl	  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   )rz  )cr|  rr  rw  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subMenuItemsrr  r  comment_sort_indexrr  rw  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_argr}  trackerr  rw  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commentThreadRendererrr  r  rr  rr  rw  r  	      zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>commentRenderer)commentr  r  defaultcommentViewModel)
commentKeytoolbarStateKeyc                    s   |d  v S )N	entityKeyrr  r  comment_keysrr  rw  r  	  r  
pinnedTextr  rY   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commentRepliesRendererrr  r  rr  rr  rw  r  	  r  
subThreads.c                 S      |d S r  rr  r  rr  rr  rw  r  	  r  c                 S   r0  )NcontinuationItemRendererrr  r  rr  rr  rw  r  
  r  )r  r  depth)r3   r    r  r  r1   r)  r  r  r  r  _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_threadr}  r  r  rT  r%  rw  rA  	  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 )r   N)r!   sysmaxsizert  prr  rr  rw  r  
  s    
z-YoutubeIE._comment_entries.<locals>.<genexpr>max_commentsr   r   FT)onResponseReceivedEndpoints.)reloadContinuationItemsCommandappendContinuationItemsActioncontinuationItems)rT  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_idrn  eprT  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  )r  rz  r  _build_api_continuation_query_generate_comment_continuationr4  countgenerate_api_headers_extract_visitor_datar   _extract_responser   r)  r  	get_paramr  r1   r  r  r  CommentsDisabled)r}  root_continuation_datarT  r  r  r  r2  r  _max_commentsr  continuationresponseis_forced_continuationis_first_continuationcontinuation_items_pathpage_numr  comment_prog_strnote_prefixrU  er  continuation_itemsr?  messagerr  )
rA  r  rB  rC  rD  rE  r}  r  r  rT  rw  r3  	  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  tokenrr  rr  rw  r_  u
  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  )rt  itemrr  rr  rw  r  
  s    zIYoutubeIE._get_comments.<locals>._real_comment_extract.<locals>.<genexpr>).itemSectionRendererrF  )r  r1   r3  )r  rendererr}  r  rT  rr  rw  _real_comment_extract
  s   z6YoutubeIE._get_comments.<locals>._real_comment_extractrK  r   r   )r!   rz  r4  r5  )r}  rT  r  r  r1  r~  rK  rr  r}  rw  _get_comments}
  s   zYoutubeIE._get_commentsc                   C   s
   dddS )NT)contentCheckOkracyCheckOkrr  rr  rr  rr  rw  _get_checkok_params
  s   
zYoutubeIE._get_checkok_paramsc                 C   sL   ddi}|d ur||d< |r||d< d|i}|rddi|d< d	|i|   S )
Nhtml5PreferenceHTML5_PREF_WANTSsignatureTimestampencryptedHostFlagscontentPlaybackContextpyvTadPlaybackContextplaybackContext)r  )r  rS  use_ad_playback_contextencrypted_contextcontextplayback_contextrr  rr  rw  _generate_player_context
  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.)rz  rF   	partitionr  r  r  r	   GVSr  rs  urlsafe_b64encodeurlsafe_b64decoder7  r8  unquoterv  binasciiError
ValueError)
r}  r  r  po_token_strs	token_strpo_token_metasepr  po_token_clientpo_token_contextrr  rr  rw  _get_config_po_token
  sD   
"zYoutubeIE._get_config_po_tokenrW   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  rT  rP  data_sync_idsession_indexr  r  video_webpagerequired_gvs_bind_to_video_idrr  )r1   r7  r8  r)   r  r	   r  is_authenticatedr  PLAYERr  r  _fetch_po_token)r}  r  r  rT  rP  r  r  r  r  r1  r  r  gvs_bind_to_video_idexperimentsconfig_po_tokenr  rr  rr  rw  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)rT  INNERTUBE_CONTEXTinnertube_hostinternal_client_namer  r  r  r  rP  r  r  request_cookiejarr  request_proxyr  zhttps://request_headersrequest_timeoutsocket_timeoutrequest_verify_tlsnocheckcertificaterequest_source_addresssource_addressbypass_cacherr  )r  rz  rF   rd  r  _downloaderproxiesr<   r=   _select_api_hostnamer   r   r1   r  	cookiejarr>   r  get_po_token)	r}  r  r  r  fetch_pot_policyr  r  r  pot_requestrr  rr  rw  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  rr  )rt  rY  r  reasonsrr  rw  r  a  s     z)YoutubeIE._is_agegated.<locals>.<genexpr>)r1   any)r  AGE_GATE_REASONSrr  r  rw  _is_agegatedW  s
   

zYoutubeIE._is_agegatedc                 C   s   t | ddkS )N)r  r  
UNPLAYABLEr1   )r  rr  rr  rw  _is_unplayablec  s   zYoutubeIE._is_unplayablec
                 C   sH  | 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}d }t|d dkrt|d}|| j|||d | j|d|||
d|d|dd dpd S )Nr   r   )rT  r  rP  r  delegated_session_iduser_session_idvideoIdPLAYER_PARAMSplayer_paramsTr  r   poTokenserviceIntegrityDimensionsFr  r  falseSUPPORTS_AD_PLAYBACK_CONTEXTr  embedded)r&  ,WEB_PLAYER_CONTEXT_CONFIG_ID_EMBEDDED_PLAYERr  )rS  r  r  playerzDownloading {} player API JSONr   )rS  rT  rn  rT  r  r  r  r   )ra  _extract_session_index_parse_data_sync_id_extract_delegated_session_id_extract_user_session_idr1   r   r
   r)  rz  rW  r  rq  r  rc  r   r4  strip)r}  r  r  webpage_ytcfgplayer_ytcfgr  
initial_prrP  r  r  r  yt_query
default_ppr  rS  r  r  rr  rr  rw  _extract_player_responseg  sR   

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_availablerI  rr  rr  rw  r        z3YoutubeIE._get_requested_clients.<locals>.<genexpr>c                 s   s$    | ]}|d d dkr|V  qd S )Nr   r  rr  rt  r  rr  rr  rw  r    r^  c                 S   s   t |  d S )Npriorityr   )r  rr  rr  rw  r    r  z2YoutubeIE._get_requested_clients.<locals>.<lambda>T)rw  reverser  r   allr<  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 requestedrX  is_music_url	web_musicc                 S   s   g | ]
}t | d  s|qS )SUPPORTS_COOKIESr  r  rr  rr  rw  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   rz  extend
startswithappendr  r   remover   r  r   r$   )r}  r|   r  is_premium_subscriberrequested_clientsexcluded_clientsjs_runtime_availabledefault_clientsallowed_clientsr  excluded_clientunsupported_clientsrr  rr  rw  _get_requested_clients  s^   





z YoutubeIE._get_requested_clientsc                 C   s   t |d }|kr|S d S )N)r  r  r  )r}  prr  pr_idrr  rr  rw  _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_namesr  actual_clientall_clientsclientsrr  rw  append_client  s   

z:YoutubeIE._extract_player_responses.<locals>.append_clientr  r  r$  REQUIRE_JS_PLAYERjsTr  )r  rP  r  r  r  r1  r  rT  PLAYER_PO_TOKEN_POLICYr  r  )r  r  r  r  rP  r  r  r  r  adaptiveFormats.rR   zmade for kidsc                 s   r  r  r  rI  rr  rr  rw  r  S  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 missingrU   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 YoutuberX  z%Failed to extract any player responserr  )6_search_json_YT_INITIAL_PLAYER_RESPONSE_REr  r  r  r
   r  rz  _download_ytcfgr+  _get_default_ytcfgr  r1  r  rb  _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  )#r}  r  r  r1  r  r  r  r  r  deprioritized_prsr   tried_iframe_fallbackr  rP  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_funcrp  r  r  sdr  embedding_is_disabledr  rr  r  rw  _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   )rd  )r}  ro   ri   rr  rr  rw  _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  )r}  r  r  protomsgrr  rr  rw  _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  )rO  r  rd  r  r  r  r  )r}  r  r  rQ  subs_wantedrr  rr  rw  _report_pot_subtitles_skipped  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 ]z}t|d}|sq|t |t |t |	t|t t|d$!d%d& dM
"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} | rPt
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|sPt$| |d=} j)| "d'dD\}!}t|ddthfD ]}|t< q&||}|!D ];}|dE }"||d/|"|o$| rNt*j'dF|	dGp4|d dHd dB|dI< |rKd|dJ< |"|dK< |dL< |V  qq|V  d S )NNi   rj   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)   r7  r8  )f_urlrr  rr  rw  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  rr  )rt  isrr  rw  r    r  zNYoutubeIE._extract_formats_and_subtitles.<locals>.solve_sig.<locals>.<genexpr>)r  )rq  specrr  rp  rw  	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   r<  r   filesizeN)r8   r6  )rt  range_start)
CHUNK_SIZEr  rr  rw  r    s    
 zTYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragments.<locals>.<genexpr>r   rt  )r   r   r  )rv  rw  rw  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_tokenrr  rr  rw  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   rY   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_maprr  rw   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 challengerF  )r9   r.  r7  r8  r9  r  )r  r|  rr  rw  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sigfuncsTrD  c                 S   s    g | ]}d  ttt|qS )r   )r  rH  chrr   )rt  spec_idrr  rr  rw  r    s     zYYoutubeIE._extract_formats_and_subtitles.<locals>.solve_js_challenges.<locals>.<listcomp>c                 S   s   g | ]}t |qS rr  )ord)rt  r  rr  rr  rw  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. r]  z9n challenge solving failed: Some formats may be missing. )r  r   r   Nr   r  r  rO  r  difference_updateSIGr   r  
bulk_solver  outputresultsr;  re  rQ  r  r   r  clear)challenge_requestscached_sigfuncsr  _challenge_requestchallenge_response	challengeresulthelp_message)n_challengesr  s_challengesr}  r  rr  rw  solve_js_challenges  st   



zEYoutubeIE._extract_formats_and_subtitles.<locals>.solve_js_challenges.r  r$  r|   signatureCipherrq  r   r  )hlsManifestUrldashManifestUrl)r$  .c                 S   s"   t | dt| dd| dfS )Nr  r~  rY   isDrc)r.   r  r1   )r  rr  rr  rw  get_stream_idH  rn  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  r~  qualityheightrX  audioQualityr   r  drmFamilieszSome rN  z6 formats have been skipped as they are DRM protected. rn  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  rr  rr  )ri   format_durationrr  rw  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audioSampleRatert  contentLength	format_idr  drcrk  format_noter  r  	(default)r  r  DRCzAI-upscaledc                 S      | d  dd S )NprojectionTypeRECTANGULARr   r4  r  r  rr  rr  rw  r    r  c                 S   r  )NspatialAudioTypeSPATIAL_AUDIO_TYPE_r   r  r  rr  rr  rw  r    r  DAMAGEDMISSING POTverboser  source_preference22r  Premiumd   r   audio_channelsaudioChannelsr  has_drmtbrfilesize_approxwidthlanguagelanguage_preference
preferencer  z.((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?mimeTyper[   noneacodecvcodec_dash	container)r.   r  r!   r  r  r  r  r   r1   r2   rz  rR  r4  r"   r3   rd  r   r   r  matchr#   r  rq  r%   )r  rP  r  super_resolutionr  r  r  r  r  r  r  rQ  r  
is_damagedrK  r  dct	mime_mobjsingle_stream)	all_formatsr  ri   r  itag_qualitiesqres_qualitiesr}  r  )r  rw  process_format_streamK  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 detailsrV   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  rD  z&{}={})spr  	signaturer  potr  r  rL  available_atdashyrt  r  z-dashyhttp_dash_segments)r  r  r  http_chunk_sizedownloader_options)r  r  r/  r   HTTPSr1  r7  r8  r)   r1   r9   r  r  r   r  r  rO  re  r8   r  r  )rP  
https_fmtsr  	stream_id
pot_policyrequire_po_tokenr  fmt_urlencrypted_sigscmsg_tmplrQ  fmtrr  rn  n_challengen_result)rv  r  r  rx  r  fetch_po_token_funcformat_typesr  r  r}  gvs_potsr  rm  itagsro   player_token_providedr  r  r}  skip_bad_formatsskip_player_jsr  rs  
stream_idsstreaming_formatsr  rr  rw  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  rS   r  r  r   r  r  r  r     r<  r  c                 3   s    | ]	\}}| kV  qd S r  rr  )rt  rJ  r  )rP  rr  rw  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  r<  r   )r  rw  rr  rr  rw  r  M  r  z[YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<lambda>r  r  c                    s   t |  d  S )Nr  )absr  rw  rr  rw  r  O  r  )rw  r  r  r  r  mayber   T)r  r"   r  r  r3   r6  rd  r   )r  rP  r  r  r  rw  	lang_code)r  r  r  r  r  r	  r  ro   r  r  r}  )r  rP  rw  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  rF  r  r  r  z/clen/(\d+)r  z	file sizert  r  r  r  F)+collectionsdefaultdictr  r*   rz  r  deprecated_featurer1   r  r  r7  r8  r)   r9   r  re  rq  r5  r9  r6  r4  r;  rM  r9  r  r  r  r  rO  r4  r/  r   HLSr1  rstriprR  r7   #_extract_m3u8_formats_and_subtitles_merge_subtitlesr.  DASHr  r!   )#r}  r  ru  r  ro   ri   	subtitlesr  streaming_datar  r  s_challenger  r  r  r  needs_live_processingskip_manifestsr  hls_manifest_urlmanifest_pathr?  manifest_suffixsolved_nr  r  r  r  r  subsr=  r  dash_manifest_urlr  r  rr  )#rv  r  r  r  r  rx  r  ri   r  r  r  r  r}  r  r  rm  r  r	  r  ro   r  r
  r  r  r  r  r  r}  r  r  r  rs  r  r  r  rw  _extract_formats_and_subtitles  s>  

<







>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playerStoryboardSpecRendererrr  r   rF  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|   ri   )r4  r)  r6  )rt  jri   fragment_durationr|   rr  rw  r    s
    
z1YoutubeIE._extract_storyboard.<locals>.<listcomp>)r  r  r[   r  r  r  r|   r  r  r  rowscolumnsr  )r    r  r9   r:   r  re  ro  r  rH  r!   r  r  r  r   r4  r)  r   mathceil)r}  ru  ri   rr  base_urlLro  r  countsr  r  frame_countcolsr9  r  sighr  rr  r7  rw  _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 )Nr1  r  
9999999999ri  )bpctrhas_verifiedr  Tr  r   r  ppz
User-Agentr  r  	userAgent)rn  r  )rz  r1   r   r)  r-  r/  )r}  r  r  r  r1  rn  rG  rr  rr  rw  _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_CONTENTrr  r  rr  rr  rw  r    r  z7YoutubeIE._get_available_at_timestamp.<locals>.<lambda>rK  fulfillmentContentfulfilledLayoutplayerBytesAdLayoutRendererrenderingContent)N)#playerBytesSequentialLayoutRenderersequentialLayouts.rQ  rR  instreamVideoAdRenderer
playerVarslength_secondsr  zan adza zs adskipOffsetMillisecondsr  r  r   z skippable after rq  z: Detected z for )r  r1   r  r7  r8  r)   r!   r   r  r  r;  r<  )
r}  r  r  r  nowwait_secondsr|  ri   ad	skip_timerr  rr  rw  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isPostLiveDvrrL  r  is_upcomingr   Frp   c                 s   s    | ]}| d V  qdS )r  Nr  r  rr  rr  rw  r    s    z*YoutubeIE._list_formats.<locals>.<genexpr>Tr  )r1   r    r/  r  )r}  r  r  r  ru  r  ri   live_broadcast_detailsr  live_contentrc  rL  ro   r  r$  r  rr  rr  rw  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)rS  rT  r  rT  rn  rU  r   r  )r  extract_yt_initial_datar1   r  rz  rq  r  rc  )r}  r  r1  r  r  rf  rn  rr  rr  rw  _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  )r}  rf  tlrrr  rr  rw  _is_premium_subscriber-  s   
z YoutubeIE._is_premium_subscriberc                 C   s~   |  |||}| ||p| |}| ||||}| |}	|	r&| d | | |||	|||||	\}
}||||	|
|fS )Nz%Detected YouTube Premium subscription)rI  extract_ytcfgr/  rh  rs  r  rJ  r  )r}  r|   r  r  r  r  r1  r  rf  r  ru  r  rr  rr  rw  r  8  s   


zYoutubeIE._initial_extractc                    s^  t |i \}}| d }|d  }|||j\	}}}}}	t|dtd}
t|
dtd}|rA	|
 |S 	rJ	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}|rc|dscd rd! d" ngg }g }|d#D ]I}tjtj|fd$d%}|d&}|s q|d}|} |r1| d'| d(7 } |d)d*td+|d& d, dd-i| d. || qd/d0| |||S tt|d1p{tt|d1p{t|d2p{d }!||||	|!\}"}#t|d3}$d4kr d5 sJd6st|$d7r  t|
d8tdpi }%|%d9pt|
d9}&t!|%d:pd;}'|'r|'"d<rt|d=}(|(s|d>})|)r|)d#nd }(j#|'|(d-d? |&d@|' 7 }&|&rJdA|&$ v rt%|&dB}&t%|&& dC d@j' }&n't|
dDdEthfr+|&dF7 }&ndG|&v rCt%|&& dC d@j(r>dHndI dJ}&j)|&d-dK t|dLt*dpSg }*|*sh	rhdMdN t+,-dO	D }*|*D ]?}+|+"dPrt+.dQ|+},|,rdRdS |,/ D \}-}.|-d,kr|.d,kr|-|. }/D ]}0|0dTdUkr|/|0dV< q nqj0||fdW}1|dXdYg}2|2r|1dZ|2i |11 }3g d[}4t2|4}5|13fd\dS|4D  |1D ]#t4fd]dSt5|4D |5}6d^dZ v rd,nd_d`|6  da< q݈6|1 j78|3 t|dbp|dc}79t:t|ddp(t|dep(|dd}8t|df}9t;t|"dg}:t;t|"dh};|!sK|;rK|:rK|;|: }!<|!}<d^dkdl}=dmv rD ]F}>|>dn}?|?dov }@d4krz|@rz|=|>dpdqdr q^|<r|>dss|=|> q^dtkr|?dukr|=|> q^|@r|=|>dvdwdr q^|<r=|:|||dtk 3>||! ?|9}Ai d&d|dxdy|1dzt|3d{d||d}|8d~t@|8d dd dd2|!dtt||fdp|ddtAt|ddt|ddu s|ddks|ddkrdnd,d|d|7r$|7gnd d|*dt|
ddt|dr:dn	t|drBdnd|:dddddddg v rTdndTddddf
d}Bdd fdd}Cfdd}Di }EtB }Ffddt|dddddd fD }GdCdvoddpd}Ht|dd }It|Idddddthf}Jfdd|JD }Kfdd|JD }L|ID ]`}M|Md d }N|Md tD }O|Md tE d d }PF|Od }Q|Md tG }Ri }Sd}Tt|Nddd fD ]}U|Ud }t||U}VtfddSdD p|QjHo|QjIo| }W|Ts4d-}T|R|Wp%|QjJdÍ }Xr4|SK|Xd|PdŜ |SsG|WrG|FL|O M|O  nȈdd gd_ }Yj|Udddȍ}Z|Udɡdk}[|[rx|Vsgq|C|E||V|Z|O|S |Udˡsxq|GN D ]W\}\}]|\sq||\}^|[r|\dkr|Hsq||\d|V 7 }\|]t@|Zd d΃7 }]|Vd|^ kr|D|^ |C|#||\ dН|] dѝ|O|S |C|#||\|]|O|Y|^kr|Snd|\i|S q|tO|Vdσ}V|[s|Vr|V|#v rqt%|ZdӃ}Z|Udˡr|D|V |C|#||V dН|Z dѝ|O|S |C|#||V|Z|O|S q|KP|E |LP|# |Ks!|Ls! nq|FrP|Ks,|LrPjMd-tQ dԝ|Ko@dd0|K dC|LoJdt2|L dםddٍdڍ |#|Bd< |E|Bd< tjR|}_|_jS|_jTfD ]1}`tj|`}a|aN D ]#\}b}cdD ]\}d}e|dd7 }d|d|Bvr|b|ev rt|cd, |B|d< qvqpqd|pd;& Udߡrt+.d|},|,r|,Vd}f|,Vd}g|gr|gWdd;}g|fs|gd d }f|BK|,Vd& |,Vd }hr|hgnddN |,VddD |,Vd& |gt|fd d t|dd fddddddfjXdd|Bd< z|d d d d d d, d d  W n tYtZt[fy,   Y nw d dddv r;dndd g|B\di d< |rm]||!pa^||!pa_||!pad |Bd< `||Bd< t|dt*g d}it|id}j|jrv|jd}k|kr|k}kta|jdd d	kr|k|Bd
< n"t+.d|k},|,r|BK|,Vdǡtb|,Vd`tb|,Vdd ta|jdd t*pg D ]Z}ltct|ldd}m|mD ]J}ndd dfdd dd gdffD ]1\}o}pta|n|otpi d}q|qr#t+d|p|q},|,r#te|,Vd|B|,Vdd <  nqqܐqt|jdddddddddd d!d"tfhfdd#|Bd$< t|jd%}r|rrvX|rd&}s|rd'rj|s|Bd(< n|Bdd u rv|s|Bd< t|id)}t|t	rvt|td*}ut|ud+d,dd-d.d/d0d1d2d3d4d5dd6ddthf}v|BK|udp|vr|vd, nd X|ud7|vr|vnd d8 |Asވ?t|ud9d:thfdd#}Ata|td;d t*pg }wd}x|wD ]}yta|yd<d d-u rd-}x nq|wD ]\}y|yd=	pi }z|zd}{|{	s	q|zd}{|zd>}||{d?k	r2|||Bd@< 	q|x	s^|{dAk	rA|||Bd< 	q|{dBk	rT||	rM||gnd |BdC< 	q|{dDk	r^|||Bd< 	qgt|tdE}}h|}tijj	rvd-|BdF< |BK|BdG|At@|Ad dHd ddI t;t|dJtkdK	pt;|dJtkdK}~|~	rtljmn|~tljojpqdLntrt|dJ	ptr|dJ}|	r|~	s܈dMv 	rtst|jdN	p|}||BdO< |~|BdP< |
rdQv
rtu|jWtljojpdR}|tudSk
r|Bdx D ]}>|>dndTk
rd-|>dU< 
qdVD ]\}}d|B|}c|c
r+|c|B|d< 
qgt|jdW}h|tijv
pEt|dXtwd}h|tijx
rQdYnGjy||
rf|d u
rfh|tijz
pednd |
ry|d u
ryh|tij{
pxdnd |Bd dk|d u 
rd nh|tij|
pt|dZtwdd[|Bd\< }||i	|Bd]< ~| |BS (_  Nz//www.youtube.com/zwatch?v=).r  r  )errorScreen%playerLegacyDesktopYpcTrailerRenderertrailerVideoIdc                    s    j | d dS )NrF  )_html_search_metar  )r}  r1  rr  rw  r  ^  r  z)YoutubeIE._real_extract.<locals>.<lambda>c                 S   s   d S r  rr  r  rr  rr  rw  r  _  s    r  r  r  .r  r  $structuredDescriptionContentRendererr;  &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).rh   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   rr  r  rK  rr  rw  r    r  z=YoutubeIE._real_extract.<locals>.feed_entry.<locals>.<lambda>)r3   r)  r  )	feed_datar  rw  
feed_entry  s   z+YoutubeIE._real_extract.<locals>.feed_entryrY   z (rR  url_transparentYoutubez{}watch?v={}r   T)_typer  r|   r]   zNDownloading multifeed video ({}) - add --no-playlist to just download video {}r  lengthSecondsri   ).r  rL  z): Video is in Post-Live Manifestless modeallow_unplayable_formats).licenseInfos)ru  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  ru  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-laterrX  keywordsc                 S   s   g | ]	}t |d qS )r  )r4   r  )rt  r?  rr  rr  rw  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  )rp  )rt  rv  rr  rr  rw  r    r  z*YoutubeIE._real_extract.<locals>.<genexpr>r  r  r   )..ru   zog:imageztwitter:imager|   )maxresdefaulthq720	sddefault	hqdefault0	mqdefaultr   sd1sd2sd3hq1hq2hq3mq1mq2mq3ri  rf  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  rK  r[   r  r  N)r   )rt  rK  r[   )ro   r  rr  rw  r    s    c                 3   s0    | ]\}}d  d |  d v r|V  qdS )r  r|   Nrr  )rt  ro  t)thumbr  rr  rw  r    r  z.webpr  r  r  categorygenrer  externalChannelIdownerProfileUrlstartTimestampendTimestamp(Last 2 hours)r  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_adjustmentrr  rr  rw  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  ru   )r  r|   rh   rd   rf   z"https://www.youtube.com/channel/%srF  r{   ).	viewCountinteractionCountaverage_ratingaverageRatingr^   isFamilySafeFisFamilyFriendlyr  zog:restrictions:agez18+r   r  ra   rt   rr   playableInEmbedro   r`  r   isShortsEligibler  rJ   r  resr  zhdr:12sourcezprefer-vp9-sortcompat_optszvcodec:vp9.2channelsr  r$  rP  )r   r   _format_sort_fieldsc                 S   s&   t | dpddddp| dS )NvssIdr   r  r<  languageCode)r,   r  r4  )r   rr  rr  rw  get_lang_codec  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  xosfr[   r|   r  rK  rc  T)r3  _SUBTITLE_FORMATSr  r:   r8   r4  )r  r=  r  sub_namer  rn  	lang_subsr  r|  rr  rw  process_languageg  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  rr  rw  "set_audio_lang_from_orig_subs_langu  s
   zCYoutubeIE._real_extract.<locals>.set_audio_lang_from_orig_subs_langc                    s$   i | ]}|d   j |d ddqS )r  languageNamer   r[  r  )rt  r$  r|  rr  rw  rx  ~  s    z+YoutubeIE._real_extract.<locals>.<dictcomp>captionsplayerCaptionsTracklistRenderertranslationLanguagesc                 S   s   |d o|d S )Nr  r  rr  r  rr  rr  rw  r    r  translated_subsr~   rT  rU  c                 S   s   |d o	|d d S )Nr  r  r  rr  r  rr  rr  rw  r    r  captionTracksc                    s"   h | ]}| d dkr |qS )kindr  r  rt  r=  r  rr  rw  	<setcomp>  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  rr  rw  r    s    r  r  
clientNameSUBS_PO_TOKEN_POLICYc                 S   r0  )Nrc  rr  r  rr  rr  rw  r    r  rc  c                 3   s    | ]
}|t  d v V  qdS ))exp.Nr  )rt  rp  )r  rr  rw  r    s    )xpexpvr  ri  )r  potcr  rK  r   r[  r  r  isTranslatableundr<  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  )rQ  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 rr  )r  )rt  arr  rr  rw  r    r  r   u    · r   )r   r   r   r   r   )ry  z!engagement-panel-comments-section)r  twoColumnWatchNextResultsr  r  r  .r{  r  . commentsEntryPointHeaderRenderercommentCountc                    s   |d d  v S )Nr  panelIdentifierrr  r  )COMMENTS_SECTION_IDSrr  rw  r    r  header"engagementPanelTitleHeaderRenderercontextualInfor  rg   r  r  conversationBarliveChatRenderercontinuationsreloadContinuationDatarh  z https://www.youtube.com/watch?v=z &bpctr=9999999999&has_verified=1json)r  rc  youtube_live_chatyoutube_live_chat_replay)r|   r  r[   r  	live_chatr   rm   )r  r  r  r  r  r  videoPrimaryInfoRenderersuperTitleLinkc                 S   r,  )NsuperTitleIconrn  rr  r  rr  rr  rw  r  A  r  LOCATION_PINr[  u   (.+?)\s*S(\d+)\s*•?\s*E(\d+)r   )seriesseason_numberepisode_numberc                 S      | d d d S )NvideoActionsmenuRenderertopLevelButtonsrr  r  rr  rr  rw  r  M  r  )toggleButtonRenderer.)"segmentedLikeDislikeButtonRenderer.r  c                 S   r  )NdefaultTextaccessibilityaccessibilityDatarr  r  rr  rr  rw  r  U  r  z*(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)c                 S   r  )Nr  rr  r  rr  rr  rw  r  W  r  c                 S   s   | d d S )Nr  rr  r  rr  rr  rw  r  X  r  zK(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other peoplerx  r`  r  _countr  r  r   #segmentedLikeDislikeButtonViewModellikeButtonViewModeltoggleButtonViewModeldefaultButtonViewModelbuttonViewModelaccessibilityTextr  rn   )r  videoViewCountRendererr  r^  r  videoSecondaryInfoRenderer)ownervideoOwnerRendererattributedTitlecommandRunsonTapr  showDialogCommandpanelLoadingStrategyinlineContentdialogViewModelcustomContentlistViewModel	listItemslistItemViewModelsubscriberCountText)rb   rc   r   )navigationEndpoint)r]   runs.r  )r  r  c                 S   r  )NmetadataRowContainermetadataRowContainerRendererr9  rr  r  rr  rr  rw  r    r  c                 S   r,  )NmetadataRowRendererhasDividerLinerr  r  rr  rr  rw  r    r  r!  )r  r   Licenser   AlbumArtistr   Song)r  r  r  r   rb   zhttps://www.youtube.com/%s)rx   ry   rz   
uploadDate)timezonez%Y%m%d)rp   NdateTextrw   rv   )r  rL  rc  )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  r  )r6   	_match_idhttp_schemer  r  r1   r  r    r)  r|  r  r  r  _preferred_langr  r  rd  r
  r  r7  r8  r)   unquote_plusr  r-   r   r  playlist_resultr!   r'   r  r  
report_drmr   r  raise_geo_restrictedr  r+   r  r<  r  raise_no_formatsr  r  finditer_meta_regexr  groups_extract_thumbnailsr  re  r
  r  ro  _remove_duplicate_formatsr  _sort_thumbnailsr  r.   r(   rM  r  rC  handle_from_urlr   r   r  rz  r4  r7  r/  r8  r  rz  r1  rq  r  rW  r;  r,   r  r"   r9  fragmentrn  endswithr  r4  r  KeyError
IndexError	TypeErrorr3  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)r}  r|   r  r=  r  r  rf  r  ru  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]   ri   rd  r  r%  pemrr  r  	countriesregions_allowedr  keywordr  whratior  r  thumbnail_urloriginal_thumbnailsthumbnail_namesn_thumbnail_namesro  r  rd   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  rG  
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_codery  	componentrn  ru  rv  d_ks_ksr   r   r  r  vpirstltlbtbrsr  getterregexrx  vcrvcvsirvorcollaboratorsr9  multiple_songsrowmrr	mrr_titlemrr_contents_textowner_badgesrv   rw   upload_datetimes_kr  r/  rr  )
r  r  r  r  ro   r  r}  r  r  r1  rw  _real_extractI  s  








 











$&







	


$










	

	
(
	



"




	 




 
 
zYoutubeIE._real_extractr  )T)NFr  )NNr   )NFN)Y__name__
__module____qualname__IE_DESCr   r  r   _INVIDIOUS_SITES
_VALID_URL_EMBED_REGEX_RETURN_TYPEr  r  r  r  r  r  r  _GEO_BYPASSIE_NAMEr  r)  _TESTS_WEBPAGE_TESTSr{  r  r  r;  r:  r  cached_propertyr~  r  r  classmethodr  r  r  r  r  r  r#  r+  r1  r  r>  r  rC  rO  rQ  rW  r{  r~  r  r  r  r  r  r  r3  staticmethodr_  r  r  r  r	   r  r  r  r  r  r  r  r  r  rJ  rM  rR  rW  r/  rC  rI  r:  r  rh  rs  r  r  __classcell__rr  rr  r  rw  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75 #    &rF   )\rs  r  r  rJ  rI  r  r4  r;  rZ  r  rG  r  r  urllib.parser7  _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>   r4  r8  r5  r6  r7  r9  r;  rO  rF   rr  rr  rr  rw  <module>   s>    ,'