
    V|h                        S SK r S SKrS SKrS SKrS SKrSSKJrJr  SSK	J
r
  SSKJrJr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"   " S S	\5      r# " S
 S\#5      r$ " S S\5      r%g)    N   )	BadgeTypeYoutubeBaseInfoExtractor)	YoutubeIE   )	HTTPErrornetwork_exceptions)
NO_DEFAULTExtractorErrorUserNotLivebug_reports_messageformat_field	get_firstint_or_noneparse_countparse_durationparse_qssmuggle_url
str_to_intstrftime_or_nonetraverse_objtry_getunsmuggle_urlupdate_url_queryurl_or_noneurljoinvariadicc                   V   \ rS rSr\S 5       r\S 5       rS rS rS r	S r
S rS&S	 jrS
 rS rS rS rS rS rS r S rS rS r\S'S j5       r\S 5       rS rS rS rS rS r\\4S j5       rS r \!RD                  S 5       r#S'S jr$S'S jr%S(S" jr&S)S# jr'S r(\)S!4S$ jr*S%r+g )*YoutubeTabBaseInfoExtractor"   c                 P   ^ ^ S m[         R                  " T 5      UU 4S j5       nU$ )Nc                 v   U R                  S5      S;  a  U $ UR                  S5      (       ar  [        R                  R                  U S   5      nUR                  S;   a@  UR                  S5        [        R                  R                  UR                  SS95      U S'   U(       a  [        U S   U5      U S'   U $ )N_type)urlurl_transparentis_music_urlr$   )www.youtube.commusic.youtube.comr(   netloc)	geturllibparseurlparser*   pop
urlunparse_replacer   )infosmuggled_data
parsed_urls      W/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/youtube/_tab.py_smuggleGYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>._smuggle%   s    xx (BB  00#\\224;?
$$(PP!%%n5"(,,"9"9*:M:MUh:M:i"jDK)$u+}EUK    c                    >^ [        U0 5      u  nmU R                  U5      (       a  STS'   T" XT5      nT(       a2  T" UT5        UR                  S5      (       a  UU4S jUS    5       US'   U$ )NTr&   entriesc              3   R   >#    U  H  nT" UTR                  5       5      v   M     g 7fN)copy).0ir6   r3   s     r5   	<genexpr>YYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper.<locals>.<genexpr>:   s'     +lWkRSHQ8J8J8L,M,MWk   $')r   r&   r+   )selfr$   	info_dictr3   r6   funcs      @r5   wrapperFYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper1   ss    !.sB!7C  %%04n-T6IM2==+++lW`ajWk+lIi(r8   )	functoolswraps)rE   rF   r6   s   ` @r5   passthrough_smuggled_data5YoutubeTabBaseInfoExtractor.passthrough_smuggled_data#   s,    
	 
			 
		 r8   c                     SnU R                  5        HW  u  p#[        U[        5      (       d  M  X!;   a  Us  $ UR                  S5      (       d  M=  UR	                  S5      (       d  MU  Us  $    g )N)playlistRenderervideoRendererchannelRenderershowRendererreelItemRenderergridRenderer)items
isinstancedict
startswithendswith)itemknown_basic_rendererskeyrenderers       r5   _extract_basic_item_renderer8YoutubeTabBaseInfoExtractor._extract_basic_item_renderer>   s[    !
 "ZZ\MCh---''CLL,D,D *r8   c                 j   UR                  S5      n[        US5      nU R                  USS5      =(       d    U R                  US5      nU R                  US5      n[        UR                  S5      5      nUc  [	        U R                  USS	5      5      nUc*  [	        U R                  S
[        USS[        S9US SS95      n[        US[        SS9nU(       d  [        US5      nU R                  U5      n[        USS[        S9nU R                  [        US5      5      n	U R                  [        US5      5      n
[        S[        US[        S95      =(       d    SnSU 3nUS:X  d  SU;   a  SU 3nU R                  USS 5      =(       d    U R                  US!5      =(       d    Sn[        [        US"SS#95      nUb  S$ODS%UR                  5       ;   a  S&O.US':X  d%  U R                  U	[        R                  5      (       a  S(OS nU R                  US)S*S 5      =(       d    SnS+UR                  5       ;   a  S,OU R                  S-U05      nUS.;   a  S/OS0nU R                  US1S25      =(       d    U R                  US35      n[        US4U R                   SS9n0 S5S6_S7["        R$                  " 5       _S8U_S6U_SU_S9U_SU_S:U_S;U_S<U(       a  S=U 3OS _S>U_S?U_S@['        US SAS SB9_SCU R)                  USD5      _SEU R+                  SF[,        SG9(       a  U R/                  U5      OS _SHU_SIU R                  U	[        R0                  5      (       a  SJOU R3                  U R                  U	[        R4                  5      =(       d    S U R                  U	[        R6                  5      =(       d    S U R                  U	[        R8                  5      =(       d    S U R                  U	[        R:                  5      =(       d    S SK9_UUSLUSMU R                  U
[        R<                  5      (       a  SN0E$ S 0E$ )ONvideoId)navigationEndpointreelWatchEndpointoverlayreelPlayerOverlayRenderer"reelPlayerHeaderSupportedRenderersreelPlayerHeaderRenderertitleheadlinereelTitleTextdescriptionSnippetlengthSeconds
lengthText)thumbnailOverlays."thumbnailOverlayTimeStatusRenderertextz](?i)(ago)(?!.*\1)\s+(?P<duration>[a-z0-9 ,]+?)(?:\s+[\d,]+\s+views)?(?:\s+-\s+play\s+short)?$)rg   accessibilityaccessibilityDatalabel )defaultexpected_typeduration)rt   group)shortBylineTextruns.ra   browseEndpointbrowseIdF)ru   get_all)channelNavigationEndpointrz   r{   )rm   .rn   styler|   ru   badgesownerBadgeshttps://www.youtube.com/)ra   commandMetadatawebCommandMetadatar$   ru    https://www.youtube.com/watch?v=SHORTSz/shorts/https://www.youtube.com/shorts/publishedTimeText	videoInfotimestampText)upcomingEventData	startTimer|   is_upcomingstreamedwas_liveLIVEis_liveviewCountTextshortViewCountTextzno viewsr   
simpleText)r   r   concurrent_view_count
view_count	ownerTextrx   channelTitleText)rx   ry   .ra   )r   r   r$   )rz   canonicalBaseUrlr#   r$   ie_keyiddescription
channel_idchannelchannel_urlz https://www.youtube.com/channel/uploaderuploader_iduploader_urlhttps://www.youtube.com/%srt   
thumbnails	thumbnail	timestampapproximate_dater   release_timestampavailabilitypublic)
is_privateneeds_premiumneeds_subscriptionis_unlistedlive_statuschannel_is_verifiedT)r+   r   	_get_textr   r   _search_regexstrucid_or_none_extract_badgesr   r   lower
_has_badger   LIVE_NOW
_get_counthandle_from_urlr   r   r   _extract_thumbnails_configuration_argYoutubeTabIE_parse_time_textAVAILABILITY_PUBLIC_availabilityAVAILABILITY_PRIVATEAVAILABILITY_PREMIUMAVAILABILITY_SUBSCRIPTIONAVAILABILITY_UNLISTEDVERIFIED)rC   r\   video_idreel_header_rendererrg   r   rv   r   overlay_styler   owner_badgesnavigation_urlr$   	time_textscheduled_timestampr   view_count_textr   view_count_fieldr   channel_handles                        r5   _extract_video*YoutubeTabBaseInfoExtractor._extract_videoL   s   <<	*+H 7N  O x*=vPdfuAvnnX/CDx||O<=%dnn,(p'r sH%d&8&8pX'_ik{~$j '9 ': ;H
 "ju.
 %&:<wxJ&&z2
$_. %%l8X&FG++L=,QR !;\\>   &#% 	 1
;H$
n(D3H:>C^^H.A;O T';_MTQS 	(h@blq)rs 1<M)Y__->>+v5QZQcQc9d9d	 	 ..?DXZefljl%)>)>)@@a??L/+JK 	6AE_6_2eq>>(K9JK Onn%9;MN 	 &h 1h ..?
U
i&&(
 (
 3	

 U
 ;
 
 *
 w
 j=j\J^b
 
 >
 L?[eij
 $228[I
 !445GP\4] //	:##
$  !4%
&  OOFI4Q4QRR''#vy7U7UV^Z^"&//&):X:X"Y"a]a'+vy?b?b'c'kgk $	8W8W X `\`	 ( b+
4 j;!4??<I[I[+\+\49
 	
8 cg9
 	
r8   c           
         U R                  US   5      nU R                  US5      n[        US SS S9nU R                  [	        USS[
        14SS95      nU(       d!  U R                  U R                  US	5      5      n0 S
S_SU_SU_S[        R                  5       _SU_SU_SU_SU_SU_SU_S[        US SS S9_S[	        US	SU R                  S9_SU R                  US5      _SU R                  US	5      b  U R                  US5      OS _SU R                  US5      _SU R                  U R                  [	        US5      5      [        R                  5      (       a  S_$ S _$ ) N	channelIdrg   "https://www.youtube.com/channel/%sr   ra   r   Fr   subscriberCountTextr#   r$   r   r   r   r   r   r   r   r   r   channel_follower_countvideoCountTextr   r   r   playlist_countr   rj   r   r   T)r   r   r   r   r   r   handle_or_noner   r   r   r   r   r   r   r   )rC   r\   r   rg   r   r   s         r5   _extract_channel_renderer5YoutubeTabBaseInfoExtractor._extract_channel_renderer   s   &&x'<=
x1":t5Ycgh--$ 'O$ !&'(
 !00J_1`aN
U
;
 *
 l))+	

 u
 
 *
 ;
 U
 >
 L?[eij
 %l/1AQUQ`Q`'b
  $228[I!
"  ??8-BCO *:;UY)
* 4>>(4HI+
, "4??$$\(M%JKYM_M_,a ,a4-
 	
. gk/
 	
r8   c           	   #     #    US    GH  n[        U[        5      (       d  M  [        US[        145      =n(       a  U R                  U5      =n(       a  Uv   MS  U R	                  U5      n[        U[        5      (       d  M{  U R                  US5      nUR                  S5      nU(       a+  U R                  SU 3[        R                  5       UUS9v   M  UR                  S5      nU(       a  U R                  U5      v   M  UR                  S5      n	U	(       a  U R                  U5      v   GM+  [        S	[        US
 [        5      5      n
U
(       d  GMQ  [        [        [         4 HM  nUR#                  U
5      (       d  M  U R                  XR                  5       UR%                  U
5      US9v     GM     GM     g 7f)NrT   lockupViewModelrg   
playlistId&https://www.youtube.com/playlist?list=ier   video_titler`   r   r   c                     U S   S   S   S   $ )Nra   r   r   r$    xs    r5   <lambda>;YoutubeTabBaseInfoExtractor._grid_entries.<locals>.<lambda>   s    A&:$;<M$NOc$dej$kr8   )rU   rV   r   _extract_lockup_view_modelr]   r   r+   
url_resultr   r   r   r   r   r   r   YoutubePlaylistIEr   suitable	_match_id)rC   grid_rendererrY   lockup_view_modelentryr\   rg   playlist_idr   r   ep_urlr   s               r5   _grid_entries)YoutubeTabBaseInfoExtractor._grid_entries   s    !'*DdD))$08ID67R$SS S ;;<MNN5NK88>Hh--NN8W5E #,,|4Koo<[MJ#**,{ % & ' ' ||I.H))(33!k2J44X>>7k: F v'):IFB{{6**"oo"yy{R\\&=Q_d . f f	 GI +s   EG(G<Gc                    [        US5      nU(       a3  [        US5      nU R                  SU 3[        R                  " 5       X#S9$ [        US5      nU(       ab  [        US5      nU(       a)  U R                  SU SU 3[        R                  5       US9$ U R                  S	U 3[        R                  5       US9$ [        US
5      nU(       a&  U R                  SU 3[        R                  5       US9$ g )N)playlistItemDatar`   )flexColumnsr   )musicResponsiveListItemFlexColumnRendererro   ry   r   ro   z"https://music.youtube.com/watch?v=)r   r   rg   )ra   watchEndpointr   )ra   r   r`   z&list=r   r   (https://music.youtube.com/playlist?list=)ra   rz   r{   z!https://music.youtube.com/browse/)r   r   r   r   r   )rC   r\   r   rg   r   	browse_ids         r5   _music_reponsive_list_entry7YoutubeTabBaseInfoExtractor._music_reponsive_list_entry   s#   *IJ  ,+ ,E ??%Gz#R&/&6&6&88 # Z Z"8-bc#H.`aH)KH:U[\g[h'i*6*=*=*?+ ' W W??%Mk]#[&2&9&9&;k # S S +_`	??%Fyk#R&2&9&9&;i # Q Q r8   c              #   "  #    UR                  S5      n[        U[        5      (       d  g UR                  S5      =(       d    UR                  S5      nU(       a  U R                  U5       S h  vN   UR                  S5      nU(       a  g g  N7f)NcontentgridRendererexpandedShelfContentsRendererhorizontalListRenderer)r+   rU   rV   r   )rC   shelf_rendererr  r\   s       r5   _shelf_entries_from_content7YoutubeTabBaseInfoExtractor._shelf_entries_from_content  sz      $$Y/'4((;;~.^'++>]2^ ))(333;;78  4s   A,B.B/Bc              #      #    [        US [        5      n[        SU5      nU(       a1  U(       a  SU;   a  g U R                  US5      nU R	                  XES9v   U R                  U5       S h  vN   g  N7f)Nc                     U S   S   S   S   $ Nendpointr   r   r$   r   r   s    r5   r   <YoutubeTabBaseInfoExtractor._shelf_entries.<locals>.<lambda>"  s    a
m4E&FG[&\]b&cr8   https://www.youtube.comz
/channels?rg   )r   )r   r   r   r   r   r
  )rC   r	  skip_channelsep	shelf_urlrg   s         r5   _shelf_entries*YoutubeTabBaseInfoExtractor._shelf_entries   sn     c 5r:	 !:NN>7;E//)/??33NCCCs   A+A5-A3.A5c              #   ,  #    US    H  n[        U[        5      (       d  M  UR                  S5      =(       d    UR                  S5      n[        U[        5      (       d  MZ  UR                  S5      nU(       d  Mt  U R                  U5      v   M     g 7f)NcontentsplaylistVideoRendererplaylistPanelVideoRendererr`   )rU   rV   r+   r   )rC   video_list_rendererr  r\   r   s        r5   _playlist_entries-YoutubeTabBaseInfoExtractor._playlist_entries0  sw     *:6Ggt,,{{#:;hw{{Kg?hHh--||I.H%%h// 7s   BBc                   ^  UR                  S5      nU(       d  g UR                  S5      nUS:X  a  [        nSU 3nSnO3US;   a  [        nSU 3nSnOT R                  S	U S
[	        5        3SS9  g T R                  XTU[        USSSS[        145      T R                  US/UQSPSP7SS9[        USSSSSSSSS[        1[        45      T R                  S[        S9(       a#  [        USSSSSSS SSSU 4S! j1[        45      S"9$ S S"9$ )#N	contentIdcontentTypeLOCKUP_CONTENT_TYPE_VIDEOr   r<   )LOCKUP_CONTENT_TYPE_PLAYLISTLOCKUP_CONTENT_TYPE_PODCASTr   )collectionThumbnailViewModelprimaryThumbnailz,Unsupported lockup view model content type ""T	only_oncemetadatalockupMetadataViewModelrg   r  contentImagethumbnailViewModelimagesources	final_keyoverlays.thumbnailOverlayBadgeViewModelthumbnailBadgesthumbnailBadgeViewModelro   r   r   contentMetadataViewModelmetadataRowsmetadataPartsc                 $   > TR                  U SS9$ )NF)report_failure)r   )trC   s    r5   r   HYoutubeTabBaseInfoExtractor._extract_lockup_view_model.<locals>.<lambda>[  s    I^I^_`qvI^Iwr8   )rg   r   rv   r   )r+   r   r   report_warningr   r   r   r   r   r   anyr   )rC   
view_model
content_idcontent_typer   r$   
thumb_keyss   `      r5   r   6YoutubeTabBaseInfoExtractor._extract_lockup_view_model<  s   ^^K0
!~~m466B4ZLAC J\\B::,GCMJ>|nANaNcMde     Zz5w	C5,R S//
=L!+=L-A=LCJ=LW` 0 b!* 4j#Gg!3(A6NK[]`/b c **+=l*S $J5zC]_m_c69?w>xz}1 @  ` 	` Z^  ` 	`r8   c              #     #    [        USS[        145      =n(       a  U R                  U5      =n(       a  Uv   g [        USS[        45      =(       d    0 nUR	                  S5      nU(       a  U R                  U5      v   g UR	                  S5      nU(       a:  U R                  SU 3[        R                  5       UU R                  US5      S9v   g UR	                  S	5      nU(       a}  [        US
SSS[        145      nU(       d  g U R                  " SU 34[        US.[        USSS[        14SS 1S44[        4SSS[        14S.5      DSU R                  USSS90D6v   g g 7f)Nr  r   )rN   rQ   rM   shortsLockupViewModelr`   r   r   rg   r   entityIdonTapinnertubeCommandrb   r   r   overlayMetadataprimaryTextaccessibilityTextc                 0    [         R                  " SU 5      $ )Nz:(.+), (?:[\d,.]+(?:[KM]| million)?|No) views? - play Short)re	fullmatchr   s    r5   r   ;YoutubeTabBaseInfoExtractor._rich_entries.<locals>.<lambda>}  s      GD  FG  :Hr8   r   secondaryText)rg   r   r   r   r.  r/  )r   rV   r   r=  r+   r   r   r   r   r   r   r   r   r   )rC   rich_grid_rendererr   r   r\   r   r   	entity_ids           r5   _rich_entries)YoutubeTabBaseInfoExtractor._rich_entries^  s     ,-?)M^ae`fAg hhh778IJJuJjlopr xuw 	 <<	*%%h//ll<0//8F&&(; NN8W= " ? ? LL,	#Hw8JL_ajmplq.rsH//1(<	ax	a x*M9seL,  0H  /I  KL  MN PST $5oyS^R_"`	* 	a  33HkU^3_	a 	a  s   E)E+c                 V    UR                  S5      nU(       a  U R                  U5      $ g )Nr`   )r+   r   )rC   video_rendererr   s      r5   _video_entry(YoutubeTabBaseInfoExtractor._video_entry  s+    !%%i0&&~66 r8   c                     [        S[        US5      5      nU(       a3  U R                  U[        R	                  5       U R                  US5      S9$ g )Nzhttps://youtube.com)onTapCommandr   r   r$   hashtag)r   rg   )r   r   r   r   r   r   )rC   hashtag_tile_rendererr$   s      r5   _hashtag_tile_entry/YoutubeTabBaseInfoExtractor._hashtag_tile_entry  s[    +\!#c.e f??++-T^^DY[d5e # g g r8   c              #     #    [        US [        5      nU(       d  g [        US [        5      =(       d    0 nUR                  S5      nU(       a  U R                  U5      nU(       a  Uv   [        US [        5      nU(       a(  U R                  SU 3[        R                  5       US9v   [        US [        5      =(       d    / nU H  n[        U[        5      (       d  M  [        US [        5      n	U	(       d  M5  [        R                  " U	5      (       d  MR  [        R                  " U	5      n
XJ:X  a  Mo  U R                  U	[        R                  " 5       U
S9v   M     g 7f)	Nc                     U S   S   $ )NpostbackstagePostRendererr   r   s    r5   r   BYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    AfI6M,Nr8   c                     U S   S   $ )NbackstageAttachmentrN   r   r   s    r5   r   rb    s    Q'<%=o%Nr8   r`   c                     U S   S   S   $ )Nrd  rM   r   r   r   s    r5   r   rb    s    Q'<%=>P%QR^%_r8   r   r   c                     U S   S   $ )NcontentTextry   r   r   s    r5   r   rb    s    -0@0Hr8   c                     U S   S   S   $ )Nra   urlEndpointr$   r   r   s    r5   r   rb    s    q!56}EeLr8   )r   rV   r+   r   r   r   r   r   listrU   r   r   r   )rC   post_thread_rendererpost_rendererrU  r   r   r   ry   runr   ep_video_ids              r5   _post_thread_entries0YoutubeTabBaseInfoExtractor._post_thread_entries  sF     "NPTV NPTV \Y[ 	!%%i0''7E_adf//8F&&(; " @ @ }&H$OUSUCc4((LcSF%%f--#--f5K&//&Y-=-=-?+/VV s   E"E$c              #   h  #    UR                  S5      n[        U[        5      (       d  g U H  nUR                  S5      n[        U[        5      (       a  U R	                  U5       S h  vN   MD  UR                  S5      n[        U[        5      (       d  Ml  U R                  U5      v   M     g  NF7f)Nr  backstagePostThreadRendererrN   )r+   rU   rj  rV   ro  rV  )rC   post_thread_continuationr  r  r\   s        r5   !_post_thread_continuation_entries=YoutubeTabBaseInfoExtractor._post_thread_continuation_entries  s     +//
;(D))G{{#@AH(D))44X>>>{{?3H(D))''11   ?s   A'B2)B0**B2B2c              #   v   #    [        US5       H%  nU R                  [        SU5      [        5      v   M'     g 7f)N)rows.reportHistoryTableRowRenderercells.reportHistoryTableCellRenderercell"reportHistoryTableTextCellRendererro   ry   .ra   r   r   r$   r  )r   r   r   r   )rC   r\   r$   s      r5   _report_history_entries3YoutubeTabBaseInfoExtractor._report_history_entries  s9      +V WC //'*CS"I9UU	Ws   79c              #   Z  ^ ^#    S /TS S & [        US [        5      =(       d    / nU GH  n[        U[        5      (       d  M  [	        USSS[        S9nU(       d  UR                  S5      (       a4  T R                  US   5       H  nUv   M	     T R                  U5      TS'   OOUR                  S5      (       a9  [	        US	5      nT R                  U5       S h  vN   T R                  U5      TS'   M  [        US
 [        5      =(       d    / nU H  n	[        U	[        5      (       d  M  T R                  T R                  T R                  T R                  U 4S jT R                  U 4S jU 4S jU 4S jU 4S jUU 4S jU 4S jS.n
U	R                  5        H?  u  pX;  a  M  X   " U5       H  nU(       d  M  Uv   M     T R                  U5      TS'     M     M     TS   (       a  GM  T R                  U5      TS'   GM     TS   (       d  T R                  U5      TS'   g g  GNM7f)Nc                     U S   $ Nr  r   r   s    r5   r   >YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s    a
mr8   itemSectionRenderermusicShelfRenderermusicShelfContinuationr   richItemRendererr   reportHistorySectionRenderer)r  tabletableRendererc                     U S   $ r  r   r   s    r5   r   r    s    !J-r8   c                 (   > TR                  U 5      /$ r<   )r  r   rC   s    r5   r   r    s    $BbBbcdBeAfr8   c                 (   > TR                  U 5      /$ r<   )rV  r  s    r5   r   r    s    0A0A!0D/Er8   c                 0   > TR                  SSU 0/05      $ )NrT   rM   r   r  s    r5   r   r    s    $2D2DgQcefPgOhEi2jr8   c                 0   > TR                  SSU 0/05      $ )NrT   rO   r  r  s    r5   r   r    s    1C1CWPacdOeNfDg1hr8   c                 (   > TR                  U 5      /$ r<   )r\  r  s    r5   r   r    s    d6N6Nq6Q5Rr8   c                 (   > TR                  U T5      $ r<   _extract_entriesr   continuation_listrC   s    r5   r   r    s    $2G2GK\2]r8   c                 (   > TR                  U 5      /$ r<   )r   r  s    r5   r   r    s    $2Q2QRS2T1Ur8   )playlistVideoListRendererr  reelShelfRenderershelfRenderermusicResponsiveListItemRendererrr  rN   rM   rO   hashtagTileRendererrichGridRendererr   )r   rj  rU   rV   r   r+   rR  _extract_continuationr}  r  r   r  ro  rT   )rC   parent_rendererr  r  r  is_rendererr   r  isr_contentsisr_contentknown_renderersr[   r\   s   ` `          r5   r  ,YoutubeTabBaseInfoExtractor._extract_entries  s     $v!?,CTJPbGgt,,&.0DF^"$K ;;122!%!3!3G<N4O!P# "Q+/+E+Eo+V%a([[!?@@(2lmE#;;EBBB+/+E+Ee+L%a(";0GNTRTL+!+t44 261G1G$($6$6)-););%)%8%87f373L3L%E(j'h+R(]'U# &1%6%6%8MC1 !0!5h!? 5"'K "@ ,0+E+Eh+O%a( &9%  ,6 %Q'''+'A'A+'N!!$]  ` !##'#=#=o#Na  $G Cs   CH+H(CH+=-H+/:H+c              #      ^ ^#    S /mUU 4S jn[        US [        5      nU(       d  g [        US [        5      =(       d    [        US [        5      =(       d    0 nU" U5       S h  vN   TS   n	[        5       n
[        R                  " S5       GH  nU	(       d    g U	R                  S5      nUb  X;   a  T R                  S5          g U
R                  U5        T R                  X4US	9nT R                  U S
U 3XUSSSSSSSSS 44S9nU(       d    g S n	T R                  U5      =(       d    UnT R                  S4T R                  S4T R                  S4T R                  S4T R                  S4US4US4T R                  S4T R                  S4T R                  S 4T R                  S 4T R                  S 4US 4T R                  S4S.n[        USSSS9n[        USS [        0 S9nS nU HP  nUU;  a  M  UU   u  nnU(       a  UU0OUnS /mU" U5       S h  vN   TS   =(       d    T R!                  U5      n	MR     U	=(       d    T R!                  SU/05      n	U	(       a  GM  U(       a  GM    g    g  GN N^7f)Nc                 (   > TR                  U T5      $ r<   r  r  s    r5   r   6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>
  s    D$9$9!=N$Or8   c                     U S   $ )Nr  r   r   s    r5   r   r    s    Qy\r8   c                     U S   $ )NsectionListRendererr   r   s    r5   r   r    s
    1-B+Cr8   c                     U S   $ )Nr  r   r   s    r5   r   r    s
    a0B.Cr8   r   r   continuationz5Detected YouTube feed looping - assuming end of feed.ytcfgdelegated_session_idvisitor_data page continuationContentsonResponseReceivedActionsonResponseReceivedEndpointsresponseContextserviceTrackingParams.paramsc                 $    U S:H  =(       a    US:H  $ )Nr[    GetRecommendedMusicPlaylists_ridr   )kvs     r5   r   r  $  s*    bcglbl  cYqr  wY  rY  cYr8   )item_idqueryheadersr  check_get_keysrT   r  rw  )rN   gridPlaylistRenderergridVideoRenderergridChannelRendererr  r  r  rr  rx  playlistVideoListContinuationgridContinuationitemSectionContinuationsectionListContinuationr   ))r  r  .appendContinuationItemsActioncontinuationItemsFr   )ru   rt   )r   rV   set	itertoolscountr+   write_debugaddgenerate_api_headers_extract_response_extract_visitor_datar   r  rt  r}  r   r  )rC   tabr  r  r  r  extract_entriestab_contentr  r  seen_continuationspage_numcontinuation_tokenr  responser  continuation_itemscontinuation_itemvideo_items_rendererr[   rE   
parent_keyr  s   `                     @r5   _entries$YoutubeTabBaseInfoExtractor._entries  s    !FOc#94@K!CTJ Q{$CTJQNP 	 #?333(+ U!*H!-!1!1.!A!-2D2Z  !XY""#56//Ua 0 cG--")6(4"5*,GIf&(?hPS  VY  Z  . H L  55h?O<L #'"4"4g!>)-););W(E&*&8&8'%B(,(:(:G'D*.*@*@*)M(7'D%4j$A040V0VXb/c262N2NPV1W262H2H$1O%)%7%7$>,0,R,RTX+Y,;T+B$($6$6#@O" ".h 9 &u"6 !--?DX\fh i#' (o-#23#7 jKU
4F'G[m$%)F! 455503gt7Q7QRf7g ) (h4+E+EzTeSfFg+hL<(<(<G + 	4x 6s2   A$I>(I9)F4I>I<AI>*I>4I><I>c                 n    U  H  nUR                  S5      (       d  M  Us  $    U(       a  [        S5      eg )NselectedzUnable to find selected tab)r+   r   )tabsfataltab_renderers      r5   _extract_selected_tab1YoutubeTabBaseInfoExtractor._extract_selected_tabY  s9     L
++## !  !>?? r8   c                      [        U S[        S9$ )N)r  twoColumnBrowseResultsRendererr  .)tabRendererexpandableTabRendererr   )r   rV   )r  s    r5   _extract_tab_renderers2YoutubeTabBaseInfoExtractor._extract_tab_renderersa  s    {  LPQ 	Qr8   c                 2   U R                  X5      nU R                  U5      nUS==   [        USS5      -  ss'   US==   [        USS5      -  ss'   U R                  " U R	                  XeS   UU R                  X#5      U R                  X25      5      40 UD6$ )Nrg   z - %sexpandedTextr   )_extract_metadata_from_tabsr  r   playlist_resultr  _extract_delegated_session_idr  )rC   r  r  datar  r)  selected_tabs          r5   _extract_from_tabs.YoutubeTabBaseInfoExtractor._extract_from_tabsf  s    33GB11$7\,II\,PP##MMtne225?**479
  	r8   c                 	   SU0n[        US[        S9nU(       a]  [        USU R                  14SU R                  145      nUR	                  UR                  S5      US.5        US   (       a  US   US'   O[        US	[        S9n[        US
SSS[        145      nS nU R                  US5      nU(       a*  U" US   S   5      n	U	(       a  UR                  U	SSS.5        U R                  US5      =(       d    U R                  USSS9n
U
 H  nSUS'   M
     U
(       a*  U" U
S   S   5      nU(       a  U
R                  USSS.5        U R                  US5      n[        US[        S9nU R                  US5      nU R                  US 5      nUR	                  [        US5      =(       d    U R                  US!5      =(       d    US   U R                  U5      U R                  US"5      =(       d     [        US#S$S%S&S'S( S)S[        1[        4
5      [        US* 5      [        US+S,S-S&[        145      =(       d    [        US.S/ 1S&45      U=(       d    UU-   U
-   S0.5        [        US1U R                   14S2S39=(       d    [        US
S&S4U R"                  14S2S39nU(       a  UR	                  U[%        US S5S S69S7.5        U R'                  [        US8S2S395      nU R)                  U[*        R,                  5      (       a  S9US:'   [/        X4S;5      nU R1                  U R                  US<5      =(       d    U R                  US=5      5      n[3        U5      US>'   U R                  US5      US?'   US?   c  U R                  US@5      US?'   US?   c  U R                  USA5      US?'   U R                  US5      USB'   USB   c  U R                  USC5      USB'   UR                  S5      (       d  [        USD5      nU(       d  [        U R                  USE5      SF5      nU R                  U5      n[        USG5      =(       d    0 nUR	                  U R5                  SHUSIUS69U R                  UR                  SJ5      5      U R!                  [7        SKUR                  SL5      5      5      SM.5        UR	                  USN   [%        UR                  S5      S SOS S69[%        UR                  SP5      S S5S S69SQ.5        U$ )RNr   )r)  channelMetadataRendererr   
externalId
channelUrlrg   )r   r   r   r)  playlistMetadataRendererheaderpageHeaderRendererr  pageHeaderViewModelc                 T    [        U =(       d    SR                  S5      S   S-   5      $ )Nrs   =r   z=s0)r   split)r$   s    r5   _get_uncroppedOYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>._get_uncropped  s&    	r005a85@AAr8   avatarr   r$   avatar_uncroppedr   )r$   r   
preference)r  .)bannermobileBannertvBanner)r  imageBannerViewModelr-  r.  r/  ir  banner_uncropped"playlistSidebarPrimaryInfoRendererr  playlistHeaderRenderer)thumbnailRenderer)playlistVideoThumbnailRendererplaylistCustomThumbnailRendererr   )playlistHeaderBannerheroPlaylistThumbnailRendererr   )r  hashtagHeaderRendererrZ  )r  .r   r)  r5  r6  .r7  c                     SUS   S   ;   $ )Nsubscribersro   r  r   _r  s     r5   r   IYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    !F)I2F!Fr8   ro   c                 &    U R                  SS5      $ )Nr   rs   )r+   r   s    r5   r   r    s    mUW@Xr8   microformatmicroformatDataRenderertagskeywordsc                 @    U =(       a    [         R                  " U 5      $ r<   )shlexr  r   s    r5   r   r    s    PQPdV[VaVabcVdPdr8   )rg   r   r   r   r  r   )vanityChannelUrl)	ownerUrls.Fr   channelHandleTextr   r   )r   r   )r  .r   Tr   ))stats
briefStatsnumVideosText   )byliner   playlistBylineRendererro   modified_dater   r   )r  r  r  .r  r  r  r  .r  r  . channelAboutFullMetadataRendererr   r   )r'  r   r(  ro   r   $playlistSidebarSecondaryInfoRenderer)
videoOwnervideoOwnerRendererrg   )ry   r   ra   rz   z^by (.+) and \d+ others?$r   r{   r  r   )r   r   r   r   r   r   )r   r   r   )r   rV   r   ucid_from_urlupdater+   r   append_extract_sidebar_info_rendererr   _extract_availabilityr   r   r=  r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rC   r  r  r2   metadata_rendererr   page_header_view_modelr   avatar_thumbnailsuncropped_avatarchannel_bannersr  uncropped_bannerprimary_sidebar_rendererplaylist_header_rendererprimary_thumbnailsplaylist_thumbnailsr   channel_badgesplaylist_statslast_updated_unixowner
owner_text	browse_eps                           r5   r  7YoutubeTabBaseInfoExtractor._extract_metadata_from_tabst  s   g(/Vfjk%&7,IZIZH[9\'3d6H6H5I&JLJKK,009(  L!!,/T
 ,T3[ko p ".d*I7Ltf5V "W
	B !445FQ-.?.B5.IJ!((+,"#*  $$T+bc j''&(S_h ( j 	 &F#&F<  & -oa.@.GH&&+,"$(  $(#F#FtMq#r #/6Zjn#o !55$  'PQ"66$&ln 	"#4g> $.\]$d 66t<&LM p 6 :NCQ`FPY\g[hjm9o p ##46XY!$8QSY[^ad`e(fg m$%6FdEegj8kl-D1DHYY\kk
 	" *-UX\XlXlWm,nx}~ nD8S2EH[H[G\"]glm 	 KK- ,^TC_im n 
 --l4AZdi.jk??>9+=+=>>*.D&' #%@Bnp !11NN>1- i~~68ghj !11B C_!__^Q?\%!%1I?![D%!% 8~ "D "&!C !)%)__5MO~%D!"xx%% !9;GE$77>deAC .J$U,_`fdfIKK--.JJXblv-w"//	j0IJ#33G<UW`WdWdewWx4yz  	Y'(>Fjtxy(-)@$Hdnrs
 	 r8   c           
   #     ^#    S =n=mn[         R                  " S5       GH=  n[        U R                  U5      5      nU(       d    g [	        U4S j[        U5       5       S5      S-   n	U	[        U5      :  a    g XS   S h  vN   U=(       d    US   S   nUS   S   m[        US 5      n
U R                  X@R                  XC5      U R                  XcU5      S9nUU
R                  S5      =(       d    TU
R                  S	5      =(       d    [        U5      U
R                  S
5      =(       d    SS.nU R                  U SU 3USXSS9n[        US [        5      nGM@     g  N7f)Nr   c              3   B   >#    U  H  u  pUS    T:X  d  M  Uv   M     g7f)r   Nr   )r>   r?   r  last_ids      r5   r@   GYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<genexpr>  s"     P(9QtW=O!!(9s   	r   r   c                 $    U S   S   S   S   S   $ )Nr  rH  r  ra   r   r   r   s    r5   r   FYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>  s    AjM"$56R$STh$ijy$zr8   r  r`   indexr  zOAE%3D)r   r`   rK  r  r  nextr  )r  r  r  r  r  r  c                     U S   S   S   S   $ )Nr  twoColumnWatchNextResultsplaylistr   r   s    r5   r   rJ    s    AjM2M$Nz$Z[e$fr8   )r  r  rj  r  rL  	enumeratelenr   r  r  r  r+   r  rV   )rC   rO  r   r  r  first_idr  r  videosstartwatch_endpointr  r  rF  s                @r5   _extract_inline_playlist4YoutubeTabBaseInfoExtractor._extract_inline_playlist  sv    (,,,7X!*H$00:;FP	&(9PRTUXYYEF#f~%%26!9T?HRj&G$z|N//2T2TUZ2a!77N 0 PG *)--i8CG'++G4CF(,,X6B(	E --&-vhZ8) . H
 fhlnH5 + &s   A>E%E#C"E%c                    UR                  S5      =(       d    [        US [        5      nUR                  S5      =(       d    Un[        U[        US [        5      5      n[        R
                  " SU5      n	U(       a0  X:w  a+  U	(       d$  U R                  U[        R                  5       UUS9$ U R                  U R                  XGX55      XvS9$ )Nrg   c                     U S   S   $ )N	titleTextr   r   r   s    r5   r   DYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>  s    AkN<8r8   r   c                     U S   S   S   S   $ r  r   r   s    r5   r   r[    s    *.? @AU VW\ ]r8   zMLCT|RLTD[\w-]{22}r   )r   playlist_title)r+   r   r   r   rL  rM  r   r   r   r  rV  )
rC   r  r$   r  rO  r  rg   r   playlist_urlis_known_unviewables
             r5   _extract_from_playlist2YoutubeTabBaseInfoExtractor._extract_from_playlist  s    W% ?8#*?ll<0;G sG]%  !ll+@+NL/8K??!4!4!6! # # # ##))(M# $ ; 	;r8   c                    U R                  US5      =(       d    0 n[        US5      =(       d    0 nUR                  S5      nU R                  [        US5      5      n[	        X24SSSSS	S
 SSS4	[
        S9n[        US[        S9nU R                  U[        R                  5      (       d  US:X  d  US:X  a  S$ U R                  Ub,  U R                  U[        R                  5      =(       d    US:H  O	Ub  US:H  OSUb,  U R                  U[        R                  5      =(       d    US:H  OUb  US:H  OUb  UOSU R                  U[        R                  5      =(       d    SU R                  U[        R                  5      =(       d    SSS9$ )z
Gets the availability of a given playlist/tab.
Note: Unless YouTube tells us explicitly, we do not assume it is public
@param data: response
r  r  privacyr   privacyFormdropdownFormFieldRendererdropdowndropdownRendererr:   c                     US   S   $ )NprivacyDropdownItemRenderer
isSelectedr   r  s     r5   r   CYoutubeTabBaseInfoExtractor._extract_availability.<locals>.<lambda>?  s    !9:<Hr8   ri  iconiconTyper   )r  r  unlistedPUBLICPRIVACY_PUBLICr   NPRIVATEPRIVACY_PRIVATEUNLISTEDPRIVACY_UNLISTEDF)r   r   r   r   
needs_auth)r1  r   r+   r   r   r   boolr   r   r   r   r   r   r   r   )rC   r  sidebar_rendererr:  player_header_privacyr   privacy_setting_iconmicroformats_is_unlisteds           r5   r2  1YoutubeTabBaseInfoExtractor._extract_availability/  s     >>tEijpnp#/6Z#[#a_a  8 < <Y G%%l3CX&NO  )%87EWYbHJgioq{}	  $0HX\$^ 
 	(E(EFF(H4'+;; 	#
 ## >S=^ OOFI,J,JK :,	9FZFf-1BBlp ?T>_ OOFI,K,KL ;,
:G[Gg-1CC5M5Y1_c#'??69;^;^#_#gcg"oofi6T6TU]Y]  $ "	#r8   c                    ^ [        U S [        5      =(       d    / nU H  n[        UU4S jU5      nU(       d  M  Us  $    g )Nc                     U S   S   S   $ )NsidebarplaylistSidebarRendererrT   r   r   s    r5   r   LYoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer.<locals>.<lambda>[  s    AiL)BCGLr8   c                    > U T   $ r<   r   )r   info_renderers    r5   r   r  ]  s
    q/?r8   )r   rj  )r  r  ru   rw  rY   r\   s    `    r5   r1  :YoutubeTabBaseInfoExtractor._extract_sidebar_info_rendererX  sE    "LdT ZWY 	$Dt%?OHx %r8   c           
          [        [        USS5      5      nU(       d  gU R                  X0R                  X25      U R	                  X#5      S9nSSU 3S.nU R                  XUSS	US
S9$ )zV
Reload playlists with unavailable videos (e.g. private videos, region blocked, etc.)
r  r  Nr  zwgYCCAA=VL)r  r{   r  Fz7Redownloading playlist API JSON with unavailable videos)r  r  r  r  r  r  note)rv  r   r  r  r  r  )rC   r  r  r  is_playlistr  r  s          r5   _reload_with_unavailable_videos;YoutubeTabBaseInfoExtractor._reload_with_unavailable_videosa  s     <:<`b c++.P.PQV.]33D@ , B !WI
 %%E%U%J & L 	Lr8   c                 L    SU R                  S[        R                  5       S9;   $ )Nwebpageskipr   )r   r   r   )rC   s    r5   skip_webpage(YoutubeTabBaseInfoExtractor.skip_webpageu  s&    D33F<CVCVCX3YYYr8   c                    Su  pEU R                  US9 Ho  n U R                  XSS9nU R                  X$=(       d    SUS9=(       d    0 n U R                  U5        [        USSS	5      (       a  M]  [        S
5      Ul	        S nMq     XE4$ ! [         a  n[	        UR
                  [        5      (       aE  [	        UR
                  [        5      (       a  UR
                  R                  S;  a  Xvl	         S nAM  U R                  XsS9   S nA  XE4$ S nAff = f! [         a  nU R                  XsS9   S nA  XE4$ S nAff = f)N)NNr  zDownloading webpage)r  rs   )i  i  r  currentVideoEndpointr  z#Incomplete yt initial data received)RetryManager_download_webpageextract_yt_initial_datar   rU   causer	   r   statuserror_error_or_warning_extract_and_report_alertsr   )rC   r$   r  r  r  r  retryes           r5   _extract_webpage,YoutubeTabBaseInfoExtractor._extract_webpagey  s=   "&&U&3E	00DY0Z33G]RW3X^\^//5  j2HJeff,-RS/ 42 }+ " agg'9::%aggy99QWW^^S]=]&' &&q&6 }+ " &&q&6 }s6   2B
D

DAD8DD
D=!D88D=c                     U(       d_  U R                   (       aM  SnSU R                  S[        R                  5       S9;  a  U(       a  [	        U S3SS9eU R                  USS9  g	g	g	)
z>Use if failed to extract ytcfg (and data) from initial webpagezePlaylists that require authentication may not extract correctly without a successful webpage download	authcheckr  r   z. If you are not downloading private content, or your cookies are only for the first account and channel, pass "--extractor-args youtubetab:skip=authcheck" to skip this checkTexpectedr'  N)is_authenticatedr   r   r   r   r<  )rC   r  r  msgs       r5   _report_playlist_authcheck6YoutubeTabBaseInfoExtractor._report_playlist_authcheck  su    ..yC$"9"9&I\I\I^"9"__di$e \ \ "	# #
 t4 /ur8   Nwebc                    S nU R                   (       d  U R                  XUS9u  pU=(       d    U R                  X(5      nU R                  U R	                  U5      SS9=(       d    0 n	US:w  aN  U	R                  S5      S:X  a9  SU R                  S/ 5      ;  a#  Sn
U(       a
  [        U
S	S
9eU R                  U
S	S9  U(       d   U R                  X4S9  U R                  XX4US9nXs4$ )Nr  F(https://www.youtube.com/feed/recommendedtabIdentifierFEwhat_to_watchno-youtube-channel-redirectcompat_optsSThe channel/playlist does not exist and the URL redirected to youtube.com home pageTr  r'  )r  default_client)r  r  extract_ytcfgr  r  r+   	get_paramr   r<  r  _extract_tab_endpoint)rC   r$   r  r  r  webpage_fatalr  r  r  r  r  s              r5   _extract_data)YoutubeTabBaseInfoExtractor._extract_data  s       11#m1TMGAT//AE55d6Q6QRV6W_d5ekikLAA$((9=NN5T^^M[]=^^k(t<<##C4#8++E+?--cE_m-nD{r8   c                 <  ^ U R                  X5S9nU R                  USU0SXcUSSUS9	nSSS	.nUR                  5        H7  u  mn	[        UU4S
 j[        5      n
U
(       d  M$  U R                  X*XX4USS9s  $    SnU(       a
  [        USS9eU R                  X5        g )N)r  r  r$   r  znavigation/resolve_urlz#Downloading API parameters API JSON)	r  r  r  r  r  r  r  r  r  browserL  )rz   r   c                    > U S   T   $ )Nr  r   )r   ep_keys    r5   r   CYoutubeTabBaseInfoExtractor._extract_tab_endpoint.<locals>.<lambda>  s    :v9Nr8   )r  r  r  )r  r  r  r  r  r  r  r  z0Failed to resolve url (does the playlist exist?)Tr  )r  r  rT   r   rV   r   r<  )rC   r$   r  r  r  r  r  resolve_response	endpointsr  r  err_noter  s               @r5   r  1YoutubeTabBaseInfoExtractor._extract_tab_endpoint  s    ++%+W11E3<
T[pu'.Sdr 2 t (0&I	#//+JFB-/NPTUFv--#b^#d . f f , F D99H.r8   c              #     #    SU0nU[         L a  U R                  nU(       a  X$S'   SnSU S3n[        U Vs1 s H  owS   iM	     sn5      nU R                  (       d  U R	                  X65      O0 n	U R                  U	SS9  S /n
S n[        R                  " S	5       H  nUR                  U
S   =(       d    0 5        U R                  XR                  U5      US
9nU R                  U SU 3SUX8XS9n[        U/UQ76 nU R                  S[        [        U5      5      0U
5       S h  vN   U
S   (       a  M    g    g s  snf  N7f)Nr  r  ))r  twoColumnSearchResultsRendererprimaryContentsr  r  )onResponseReceivedCommandsr   r  r  )r  tabbedSearchResultsRendererr  r   r  r  r  r  )r  zquery "r&  r   Fr  r   )r  r  r  r  search)r  r  r  r  r  r  r  r  )r
   _SEARCH_PARAMStupler  _download_ytcfgr  r  r  r/  r  r  r  r   r  rj  r   )rC   r  r  r  r  content_keys
display_idkeysr  r  r  r  r  r  slr_contentss                  r5   _search_results+YoutubeTabBaseInfoExtractor._search_results  si    Z((F#N
 ugQ'
LALDQLABHLHYHY$$^@_a''U';!F!*HKK)!,23//*D*DV*L]k 0 mG++%,fXJ7HD-TY , lF (>>L,,j$x?U:V-WYjkkk$Q'' +  B ls#   6ED>C"E(E)E9Er   )F)T)NTFr  )NTr  ),__name__
__module____qualname____firstlineno__staticmethodrJ   r]   r   r   r   r  r
  r  r  r   rR  rV  r\  ro  rt  r}  r  r  r  r  r  r  rV  r`  r2  rV   r1  r  rH   cached_propertyr  r  r  r  r  r  r
   r  __static_attributes__r   r8   r5   r   r   "   s5    4    ]
~$
L)VQ*D 
0 `D#J7
g"WH2V5OnOb @ @ Q QCJn>;.'#R JN    L( Z Z:
5&/$ N,6u r8   r   c                   <  ^  \ rS rSrSrSR                  \R                  SR                  \R                  5      S9r
Sr/ SSS	S
SSSSSSS
SS\S.S.PSSS	S
SSSSSSS
SS\S.S.PSSSSSSSSSSS SS!/\S"S#.S.PS$S%S&S'S(S)S*S+S,S'S-S.S*\S/.S.PS0S"S1.PS2S3S4S5S6/ \S7S8S9S:S;S8S<S=S>.S?S@.PSASBSCSD/ SES6SFSGSHSISJSKSESL.SMS@.PSNSOSPSQSRSSSTSS/ SUQSVSWSP\SX.SYSZ.PS[S\SPS]SRSSST/ SUQSWSPSVSS\S^.S_SZ.PS`SaSPS]SRSSSTSPSVSS/ SUQSW\Sb.ScSZ.PSdSeSPSfSRSSSTSVSSSWSP/ SUQ\Sg.ShSZ.PSiSjSPSkSRSSSWSP/ SUQ\SVSTSSSl.SmSnSo.PSpSqSrSSsSSS!/SS\S SSS"St.S.PSuS"S1.PSvS"S1.PSwS"S1.PSxSySzS{S|/ \S}S~SSS;SSSS.SS@.PSSSSS/ SS\S6SS;SSSS.SS/S.PSSS"S.PSSSS/ \SSSS6SS;SSSS.SSZ.PSSSS\S/ SSSSS;SSSS.SS/S.PSSSSSSS\/ SS6S;SSSS.SS/S.PSSSSS/ \SSSS;SSSSS.SSZ.PSS"S1.PSSSSSSSSS/\\\S.
SS"0S\R                  " 5       /S.PSS"S1.PSS"S1.PS0 SS_SS_S\_SS_S\_SS/_S\_S\_S\_SS_SS_SSM_S\_SS_SS"_SS_SS;_SS\\SSSS"S\S.
ESS"0S/S.PSSSSSSSS// SQ\S.	SS"0S"S.PSS"S1.PSS"S1.PGS GSS"S.PGSS"S1.PGSS"S1.PGSS"S1.PGSS"S1.PGSS"S1.PGSGSS"S.PGS	GS
S"S.PGSS"S1.PGSS"S1.PGSS"S1.PGSS"S1.PGSGSGS/ GS.GSGS.PGSS"S1.PGSGSS"S.PGSGSS"S.PGSGSGSGSGSGSS\GS / GS!S;GS"GS!GS#GS$.GS%SGS&/S.PGS'GS(GS)GS*/ GS+GS,\GS-SS6S;GS,GS..GS/GS&S/S.PGS0GS1GS1/ GS.GS2GS.PGS3GS4GS5GS6/ \S6SISGS7.GS8GS&/GS9.PGS:GS;GS<GS=SI/ S7S8\S6S9S:S<S=S8GS>.GS?GS@GSAGSBGSCGSDGSEGSF\GSGGSHGSIGSJGSHGSK.0/S?GSLS"0GSM.PGSNGSGSOGSO/ GS.SMS"GSPGSQGSR/00GSS.GST.PGSUGSVGSWGSXGSYGSZGSW/ GS[\GS\.GS]S"GSPGSQGSR/00GSS.GS^GS_.PGS`GS(GS)GS*SGS+S6GS-/ GS,\S;GS,GSa.GS/S"GSPGSQGSR/00GSS.GS&S/GSb.PGScGSdS"S.PGSeGSfGSgGShGSi/ SIGSjGSkGSlGSm\GSnGSoGSkGSp.SYGSqSo.PGSrGSsS9/ S:GStGSuS9S8S<S=S8GSv.
S?GSwGSxGSyGSz/000GS{/GSb.PGS|GS}GS~/ \S:S8S9GSGSS;S<S=S8GS.S?GSwGSxGSyGSz/000GS{/GSb.PGSGSGS/ GS.GS8GS.PGSGSGS/ GS.GSGS.PGSGSGS/ GS.GSGS.PGSGSGS/ GS.GSGS.PGSGSGS\GSGSGSGSGSGSGSGSS"GS.GSGS.PGSGSGSGSGSGS\GSGSGSGSGSS"GS.GSGS.PGSGSGSGSGSGSGS\GSGSGSGSGS.GSGS.PGSS"S1.PGSS"S1.PGSGSGSGSGSGSGS\GSGSGSGSGS.GSGS.PGSGSGS/ GS.GSGSGS.PGSGSGS/ GS.GSGS.PGSS9GSS8GStS9S:/ S<S=S8GS.
GS?GSBGSCGSGSGS\\GS.0/GSLS"0GS.PGSGSGS/ GS.GS?GSBGSCGS\\S\\\\\\\\GS.0/S"GSGS.S?GS.PGSS9GSS8GStS9S:/ S<S=S8GS.
GS?GSBGSGSGSGSGSGSGS\\\GSGSGSS"GS.0/GSLS"0GSGS.PGSSS!/S\SSSSS SSS"GS.SMGS.PGSGSGSGSGSGSGS\GS/ GSGSGS.SGS.PGSGSGSGSGSGSGSGSS.GSGS\S"GS.GSGS.PGSGSGS\GSS6GSGSGSGS/ S;SGSGS.GSS/GS.PGSGSGSGSGSGSGS\GSGSGSGSGSS"/ GS QGS.GS.PGSGSSGSGSGSGS\GSGS	GS
GSGS/ GS.S.Pr\U 4GS j5       r\R,                  " GS\
 GS35      rGS rGSGS jrGS rGS r\R:                  GS 5       rGSrU =r $ (  r   i  zYouTube Tabsa  (?x:
        https?://
            (?!consent\.)(?:\w+\.)?
            (?:
                youtube(?:kids)?\.com|
                {invidious}
            )/
            (?:
                (?P<channel_type>channel|c|user|browse)/|
                (?P<not_channel>
                    feed/|hashtag/|
                    (?:playlist|watch)\?.*?\blist=
                )|
                (?!(?:{reserved_names})\b)  # Direct URLs
            )
            (?P<id>[^/?\#&]+)
    )|)reserved_names	invidiouszyoutube:tabzplaylists, multipageuM   https://www.youtube.com/c/ИгорьКлейнер/playlists?view=1&flow=grid^   UCqj7Cz7revf5maW9g5pgNcgzIgor Kleiner  - Playlistsu{   re:(?s)Добро пожаловать на мой канал! Здесь вы найдете видео .{504}/a1/50b/10a$zIgor Kleiner z@IgorDataSciencez(https://www.youtube.com/@IgorDataSciencezcount:23z8https://www.youtube.com/channel/UCqj7Cz7revf5maW9g5pgNcg)r   rg   r   r   r   r   r   r   r  r   r   )r  r$   playlist_mincountrD   z%playlists, multipage, different orderz>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=dd)r   rg   r   r   r   r   r  r   r   r   r   zplaylists, serieszJhttps://www.youtube.com/c/3blue1brown/playlists?view=50&sort=dd&shelf_id=3   UCYO_jab_esuFRV4b17AJtAwz3Blue1Brown - Playlistsz$md5:602e3789e6a0cb7d9d352186b720e395z8https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw3Blue1Brownz@3blue1brownz$https://www.youtube.com/@3blue1brownMathematicsT)r   rg   r   r   r   r   r   r   r   r  r   r   zplaylists, singlepagez7https://www.youtube.com/user/ThirstForScience/playlists   UCAEtajcuhQ6an9WEzY9LEMQzThirstForScience - Playlistsz$md5:609399d937ea957b0f53cbffb747a14cThirstForSciencez)https://www.youtube.com/@ThirstForSciencez@ThirstForSciencez8https://www.youtube.com/channel/UCAEtajcuhQ6an9WEzY9LEMQzcount:12)r   rg   r   r   r   r   r   r   r  r   r   z3https://www.youtube.com/c/ChristophLaimer/playlistsr$   only_matchingzbasic, single video playlistzHhttps://www.youtube.com/playlist?list=PLt5yu3-wZAlSLRHmI1qNm0wjyVNWw1pCUz"PLt5yu3-wZAlSLRHmI1qNm0wjyVNWw1pCUzsingle video playlistrs   20250417zcole-dlp-test-acczUCiu-3thuViMebBjw_5nWYrAz8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrAr   z"https://www.youtube.com/@coletdjnzz
@coletdjnz)r   rg   r   r  r   r)  r   r   r   r   r   r   r   r   )r  r$   rD   r   zempty playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfz"PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfzyoutube-dl empty playlistz	Sergey M.20230921UCmlqkdCBesrv2Lak1mF_MxAz8https://www.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxArn  z%https://www.youtube.com/@sergeym.6173z@sergeym.6173)r   rg   r  r   r   r)  r   r   r   r   r   r   r   zHome tabzAhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/featuredUCKfVa3S1e4PHvxWcwyMMg8wzlex will - Homez$md5:2163c5d0ff54ed5f598d6a7e6211e488zlex willz@lexwill718)biblehistoryprophesyz#https://www.youtube.com/@lexwill718z8https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w)r   rg   r   r   r   r   r  r   r   r   r   r&  r  r$   rD   r  z
Videos tabz?https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videoszlex will - Videos)r   rg   r   r   r   r  r   r   r   r   r   i  zVideos tab, sorted by popularzWhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videos?view=0&sort=p&flow=grid)r   rg   r   r   r   r   r   r   r  r   r      zPlaylists tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlistszlex will - Playlists)r   rg   r   r   r   r   r   r   r   r  r      z	Posts tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/communityzlex will - Posts)r   rg   r   r   r   r   r  r   r   r   r      zThis Community isn't available)r  r$   rD   r  r  z
Search tabzChttps://www.youtube.com/c/3blue1brown/search?query=linear%20algebra(   z%3Blue1Brown - Search - linear algebra)r   rg   r   r   r  r   r   r   r   r   r   r   z3https://invidio.us/channel/UCmlqkdCBesrv2Lak1mF_MxAz<https://www.youtubekids.com/channel/UCmlqkdCBesrv2Lak1mF_MxAz:https://music.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxAzZPlaylist with deleted videos (#651). As a bonus, the video #51 is also twice in this list.zHhttps://www.youtube.com/playlist?list=PLwP_SiAcdui0KVebT0mU9Apz359a4ubsCz29C3: Not my department"PLwP_SiAcdui0KVebT0mU9Apz359a4ubsCz$md5:a14dc1a8ef8307a9807fe136a066026820150605UCEPzS1rYsrkqzSLNp76nrcgz8https://www.youtube.com/channel/UCEPzS1rYsrkqzSLNp76nrcgChristiaan008z@ChRiStIaAn008z&https://www.youtube.com/@ChRiStIaAn008)rg   r   r   r  r   r)  r   r   r   r   r   r   r   `   zLarge playlistz>https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0QzUploads from CauchemarUUBABnxM4Ar9ten8Mdjj1j0Qz8https://www.youtube.com/channel/UCBABnxM4Ar9ten8Mdjj1j0Qre:\d{8}	CauchemarUCBABnxM4Ar9ten8Mdjj1j0Qz@Cauchemar89z$https://www.youtube.com/@Cauchemar89)rg   r   r   r  r)  r   r   r   r   r   r   r   r   ic  *[Uu]navailable videos (are|will be) hidden)r  r$   rD   r  expected_warningsz!even larger playlist, 8832 videosz/http://www.youtube.com/user/NASAgovVideo/videos)r  r$   r  zTBuggy playlist: the webpage has a "Load more" button but it doesn't have more videosz>https://www.youtube.com/playlist?list=UUXw-G3eDE9trcvY2sBMM_aAzUploads from Interstellar MoviezUUXw-G3eDE9trcvY2sBMM_aAzUCXw-G3eDE9trcvY2sBMM_aAz8https://www.youtube.com/channel/UCXw-G3eDE9trcvY2sBMM_aAzInterstellar Moviez@InterstellarMoviez*https://www.youtube.com/@InterstellarMovie)rg   r   r  r   r   r   r   r   r)  r   r   r   r      z.Playlist with "show unavailable videos" buttonzHhttps://www.youtube.com/playlist?list=PLYwq8WOe86_xGmR7FrcJq8Sb7VW8K3Tt2zThe Memes Of 2010s....."PLYwq8WOe86_xGmR7FrcJq8Sb7VW8K3Tt2zI'm Not JiNxEdz$md5:44dc3b315ba69394feaafa2f40e7b2a1z8https://www.youtube.com/channel/UC5H5H85D1QE5-fuWWQ1hdNgzUC5H5H85D1QE5-fuWWQ1hdNgz(https://www.youtube.com/@imnotjinxed1998z@imnotjinxed1998)rg   r   r   r   r  r   r   r   r)  r   r   r   r      z*Playlist with unavailable videos in page 7z>https://www.youtube.com/playlist?list=UU8l9frL61Yl5KFOl87nIm2wzUploads from BlankTVUU8l9frL61Yl5KFOl87nIm2wBlankTVz8https://www.youtube.com/channel/UC8l9frL61Yl5KFOl87nIm2wUC8l9frL61Yl5KFOl87nIm2wz@blanktvz https://www.youtube.com/@blanktv)rg   r   r   r   r   r   r  r)  r   r   r   r   r   i  z3https://github.com/ytdl-org/youtube-dl/issues/21844zHhttps://www.youtube.com/playlist?list=PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz Data Analysis with Dr Mike Pound"PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz$md5:7f567c574d13d3f8c0954d9ffee4e487zUC9-y-6csu5WGm29I7JiwpnAz8https://www.youtube.com/channel/UC9-y-6csu5WGm29I7JiwpnAComputerphile20190712z@Computerphilez&https://www.youtube.com/@Computerphile)rg   r   r   r  r   r   r   r   r   r)  r   r   r      zChttps://invidio.us/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcz4Playlist URL that does not actually serve a playlistzThttps://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4FqZTN594JQwwebmz6Smiley's People 01 detective, Adventure Series, Action20150526zStandard YouTube Licensez$md5:507cdcb5a49ac0da37a920ece610be80zPeople & Blogs)
r   extrg   upload_datelicenser   
categoriesr  r   
like_countskip_downloadzThis video is not available.)r  r$   rD   r  r  add_iezMhttps://www.youtubekids.com/watch?v=Agk7R8I8o5U&list=PUZ6jURNr1WQZCNHF0ao-c0gz5https://www.youtube.com/watch?v=MuAGGZNfUkU&list=RDMMz=https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQ/liver   VFGoUmo74wEr  mp4rg   r	  r   r  zNews & Politicsr  r  r   r   zSky Newsr   zUCoMdktPbSTixAyNGwb-UYkQ	age_limitr   r   z?re:https?://i\.ytimg\.com/vi/[^/]+/maxresdefault(?:_live)?\.jpgplayable_in_embedrelease_datezre:\d+r   r   z8https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQz https://www.youtube.com/@SkyNewsz@SkyNews
livestream)
r   r   r   r   r   r   r   r   
media_typer   z"Ignoring subtitle tracks found in )r$   rD   r  r  z/https://www.youtube.com/user/TheYoungTurks/livea48o2S1cPooz The Young Turks - Live Main Show20150715z$md5:438179573adcdff3c97ebb1ee632b891)zCenk Uygur (TV Program Creator)z$The Young Turks (Award-Winning Work)zTalk Show (TV Genre))	r   r  rg   r	  r
  r   r  r  r  )r$   rD   r  r  z=https://www.youtube.com/channel/UC1yBKRuGpC1tSM73A0ZjYjQ/livez/https://www.youtube.com/c/CommanderVideoHq/livez.A channel that is not live. Should raise errorz-https://www.youtube.com/user/numberphile/livez%https://www.youtube.com/feed/trendingz$https://www.youtube.com/feed/libraryz$https://www.youtube.com/feed/historyz*https://www.youtube.com/feed/subscriptionsz(https://www.youtube.com/feed/watch_laterz%Recommended - redirects to home page.r  z5inline playlist with not always working continuationszChttps://www.youtube.com/watch?v=UC6u0Tct-Fo&list=PL36D642111D65BE7Czhttps://www.youtube.com/coursez!https://www.youtube.com/zsecurityz*http://www.youtube.com/NASAgovVideo/videosz*https://www.youtube.com/TheYoungTurks/livez%https://www.youtube.com/hashtag/cctv9cctv9zcctv9 - All)r   rg   r  i,  )r$   rD   r  zdhttps://www.youtube.com/watch?list=PLW4dVinRY435CBE_JD3t-0SRXKfnZHS1P&feature=youtu.be&v=M9cJMXmQ_ZUziRequires Premium: should request additional YTM-info webpage (and have format 141) for videos in playlistzJhttps://music.youtube.com/playlist?list=PLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkqz%/browse/ should redirect to /channel/z9https://music.youtube.com/browse/UC1a8OFewdjuLq6KlF8M_8Ngz,VLPL, should redirect to playlist?list=PL...zEhttps://music.youtube.com/browse/VLPLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkq"PLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkqz]Providing you with copyright free / safe music for gaming, live streaming, studying and more!u   NCS : All Releases 💿z8https://www.youtube.com/channel/UC_aEa8K-EOJ3D6gOs7HcyNgzUC_aEa8K-EOJ3D6gOs7HcyNgNoCopyrightSoundsz*https://www.youtube.com/@NoCopyrightSoundsz@NoCopyrightSounds)r   r   rg   r   r)  r   r   r  r   r   r   r   r      z'YouTube Music is not directly supportedz-Topic, should redirect to playlist?list=UU...z9https://music.youtube.com/browse/UC9ALqqC4aIeG5iDs7i90BfwUU9ALqqC4aIeG5iDs7i90Bfwz'Uploads from Royalty Free Music - TopicUC9ALqqC4aIeG5iDs7i90BfwzRoyalty Free Music - Topicz8https://www.youtube.com/channel/UC9ALqqC4aIeG5iDs7i90Bfw)r   rg   r  r   r   r   r   r)  r   r   r   e   z8https://www.youtube.com/channel/UCtFRv9O2AHqOZjjynzrv-xgzUCtFRv9O2AHqOZjjynzrv-xg	   zYoutube music Albumz2https://music.youtube.com/browse/MPREb_gTAcphH99wE)OLAK5uy_l1m0thk3g31NmIIz_vMIbWtyv7eZixlH0z0Album - Royalty Free Music Library V2 (50 Songs))r   rg   r  r   r   r   r)  2   )r  r$   rD   r   r  zunlisted single video playlistzHhttps://www.youtube.com/playlist?list=PLt5yu3-wZAlQLfIN0MMgp0wVV6MP3bM4_z"PLt5yu3-wZAlQLfIN0MMgp0wVV6MP3bM4_zunlisted playlist)r   rg   r   r  r)  r   r   r   r   r   r   r   r   rD   z@Big Buck Bunny 60fps 4K - Official Blender Foundation Short Filmzaqz-KE-bpKQr$   Youtubei{  UCSMOQeBJ2RAnuFungnQOxLgz8https://www.youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLgz+https://www.youtube.com/watch?v=aqz-KE-bpKQBlenderz@BlenderOfficialz(https://www.youtube.com/@BlenderOfficial)rg   r   r#   r   rv   r   r   r   r$   r   r   r   r   extract_flat)r  r$   rD   rO  r   r  zHAPI Fallback: Recommended - redirects to home page. Requires visitorDatarecommended
youtubetabr  r  )r  extractor_args)r  r$   rD   r   r  z1API Fallback: /videos tab, sorted by oldest firstzJhttps://www.youtube.com/user/theCodyReeder/videos?view=0&sort=da&flow=gridUCu6mSoMNzHQiBIOCkHUa2AwzCody'sLab - Videosz$md5:d083b7c2f0c67ee7a6c74c3e9b4243faz	Cody'sLabz8https://www.youtube.com/channel/UCu6mSoMNzHQiBIOCkHUa2Aw)r   rg   r   r   r   r  r   r   i  z!Query for sorting no longer works)r  r$   rD   r  r  r  z;API Fallback: Topic, should redirect to playlist?list=UU...)r   rg   r)  r   r   r   r  r   r   r   r   )r  r$   rD   r  r  r  z)non-standard redirect to regional channelz8https://www.youtube.com/channel/UCwVVpHQ2Cs9iGJfpdFngePQzQcollaborative playlist (uploader name in the form "by <uploader> and x other(s)")zHhttps://www.youtube.com/playlist?list=PLx-_-Kk4c89oOHEDQAojOXzEzemXxoqx6z"PLx-_-Kk4c89oOHEDQAojOXzEzemXxoqx620250115z8https://www.youtube.com/channel/UCKcqXmCcyqnhgpA5P0oHH_QUCKcqXmCcyqnhgpA5P0oHH_Q	pukkandanzTest for collaborative playlistz$yt-dlp test - collaborative playlistz"https://www.youtube.com/@pukkandanz
@pukkandan)r   r)  r   r  r   r   r   r   rg   r   r   r   r   z-https://github.com/yt-dlp/yt-dlp/issues/13690ztranslated tab namezBhttps://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/playlistsztest descriptionu#   cole-dlp-test-acc - 再生リスト)
r   r  r   r   rg   r   r   r   r   r   r(  youtubelangjazPreferring "ja"z=preferred lang set with playlist with translated video titleszHhttps://www.youtube.com/playlist?list=PLt5yu3-wZAlQAaPZ5Z-rJoTdbT-45Q7c0z"PLt5yu3-wZAlQAaPZ5Z-rJoTdbT-45Q7c0testzdlp test playlist)r   r  r   r   r   r   r   rg   r   r   r   r   zphttps://www.youtube.com/feed/sfv_audio_pivot?bp=8gUrCikSJwoLMkd0VmtzQk1ZRk0SCzJHdFZrc0JNWUZNGgsyR3RWa3NCTVlGTQ==sfv_audio_pivotz=https://www.youtube.com/channel/UCEH7P7kyJIkS_gJf93VYbmg/liveUCEH7P7kyJIkS_gJf93VYbmgzUCEH7P7kyJIkS_gJf93VYbmg - Live   zAhttps://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/letsplayUCQvWX73GQygcwXOTSf_VDVgz%UCQvWX73GQygcwXOTSf_VDVg - Let's play   z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/homezUCQvWX73GQygcwXOTSf_VDVg - Homez8https://www.youtube.com/channel/UCK9V2B22uJYu3N7eR_BT9QAUCK9V2B22uJYu3N7eR_BT9QAu   Polka Ch. 尾丸ポルカz$md5:01e53f350ab8ad6fcf7c4fedb3c1b99fzcount:35z#https://www.youtube.com/@OmaruPolkaz@OmaruPolka)r   rg   r   r   r   r   r   r  r   r   r   r   r   )r$   rD   r   z,https://www.youtube.com/@NotJustBikes/shortszUC0intLFzLaudFG-xAvUEO-AzNot Just Bikes - Shortszcount:10z8https://www.youtube.com/channel/UC0intLFzLaudFG-xAvUEO-Az$md5:295758591d0d43d8594277be54584da7zNot Just Bikesz%https://www.youtube.com/@NotJustBikesz@NotJustBikes)r   rg   r  r   r   r   r   r   r   r   r   r   
   z@https://www.youtube.com/channel/UC3eYAvjCVwNHgkaGbXX3sig/streamsUC3eYAvjCVwNHgkaGbXX3sigu   中村悠一 - Livezcount:7z8https://www.youtube.com/channel/UC3eYAvjCVwNHgkaGbXX3sigu   中村悠一z$md5:76b312b48a26c3b0e4d90e2dfc1b417dz(https://www.youtube.com/@Yuichi-Nakamuraz@Yuichi-Nakamura)r   rg   r  r   r   r   r   r   r   r   r   <   z8https://www.youtube.com/channel/UC2yXPzFejc422buOIzn_0CAzhttps://www.youtube.com/newsz#https://www.youtube.com/c/TKFShortsUCgJ5_1F6yJhYLnyMszUdmUgzShorts Break - Shortszcount:48zShorts Breakz$md5:6de33c5e7ba686e5f3efd4e19c7ef499z8https://www.youtube.com/channel/UCgJ5_1F6yJhYLnyMszUdmUgz-https://www.youtube.com/@ShortsBreak_Officialz@ShortsBreak_Official)r   rg   r  r   r   r   r   r   r   r   r      trendingztrending - Nowr  )r$   rD   r  r  zYhttps://www.youtube.com/feed/trending?bp=4gIcGhpnYW1pbmdfY29ycHVzX21vc3RfcG9wdWxhcg%3D%3Dz?https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/shortszcole-dlp-test-acc - Shorts)
r   rg   r   r   r   r   r  r   r   r   z*https://www.youtube.com/shorts/sSM9J5YH_60sSM9J5YH_60zSHORT short)r#   r   r$   r   rg   r   r   )r$   rD   rO  r  z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/livezUCQvWX73GQygcwXOTSf_VDVg - Livez+startswith:https://www.youtube.com/watch?v=)r#   r   r$   r   rg   r   r   r   r   r   r   r   r   r   1)r%  playlist_items)r$   rD   rO  r  r  zAhttps://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/channelszcole-dlp-test-acc - Channels
YoutubeTabz8https://www.youtube.com/channel/UC-lHJZR3Gqxm24_Vd_AJ5YwzUC-lHJZR3Gqxm24_Vd_AJ5Yw	PewDiePiez"https://www.youtube.com/@PewDiePiez
@PewDiePie)r#   r   r$   r   r   rg   r   r   r   r   r   r   r   r   r   zchannels tab removed)r$   rD   rO  r  r  z*https://www.youtube.com/@3blue1brown/about)r   r  rg   r   r   r   r   r   r   r   r   r   z;https://www.youtube.com/@99percentinvisiblepodcast/podcastsUCVMF2HD4ZgC0QHpU9Yq5Xrwz2https://www.youtube.com/@99percentinvisiblepodcastz$md5:3a0ed38f1ad42a68ef0428c04a15695cz99% Invisible - Podcastsz99% Invisiblez8https://www.youtube.com/channel/UCVMF2HD4ZgC0QHpU9Yq5Xrwz@99percentinvisiblepodcast)r   r   r   r   rg   r   r   r   r  r   r   z*https://www.youtube.com/@AHimitsu/releaseszUCgFwu-j5-xNJml2FtTrrB3Az	A Himitsuz!https://www.youtube.com/@AHimitsuzA Himitsu - Releasesz	@AHimitsuzMusic producer, sometimes.z8https://www.youtube.com/channel/UCgFwu-j5-xNJml2FtTrrB3A)r   r   r   rg   r   r   r   r  r   r   r   r   z>https://www.youtube.com/playlist?list=UUxqPAgubo4coVn9Lx1FuKcgUUxqPAgubo4coVn9Lx1FuKcgz8https://www.youtube.com/channel/UCxqPAgubo4coVn9Lx1FuKcgz@BangyShortsz$https://www.youtube.com/@BangyShortsUCxqPAgubo4coVn9Lx1FuKcgzBangy ShortszUploads from Bangy Shorts)r   r   r   r   r   r   r   r   r   r  r   r)  rg   d   )r$   rD   r  r  zTags containing spacesz8https://www.youtube.com/channel/UC7_YxT-KID8kRbqZo7MyscQzUC7_YxT-KID8kRbqZo7MyscQ
Markiplierz$md5:0c010910558658824402809750dc5d97z@markiplierz#https://www.youtube.com/@markiplier)
markipliercomedygamingzfunny videoszfunny momentszsketch comedylaughingz	lets playzchallenge videos	hilarious
challengessketcheszscary gameszfunny gamesz
rage gameszmark fischbach)r   r   r   rg   r   r   r   r   r   r   r   r  )r  r$   r   rD   zestreams tab, some scheduled streams. Empty intermediate response with only continuation - must followz*https://www.youtube.com/@sbcitygov/streamszUCH6-qfQwlUgz9SAf05jvc_w	sbcitygovzsbcitygov - Livez$md5:ca1a92059835c071e33b3db52f4a6d67z
@sbcitygovz"https://www.youtube.com/@sbcitygovz8https://www.youtube.com/channel/UCH6-qfQwlUgz9SAf05jvc_w)r   r   r   rg   r   r   r   r   r   r   r  c                 \   > [         R                  " U5      (       a  S$ [        TU ]  U5      $ )NF)r   r   super)clsr$   	__class__s     r5   r   YoutubeTabIE.suitable3  s(    !**3//uJUW5Ec5JJr8   z(?P<pre>z1)(?(not_channel)|(?P<tab>/[^?#/]+))?(?P<post>.*)$c                     U R                   R                  U5      R                  5       nUR                  S UR	                  5        5       5        U$ )Nc              3   8   #    U  H  u  pUb  M
  US4v   M     g 7f)Nrs   r   )r>   r  r  s      r5   r@   -YoutubeTabIE._get_url_mobj.<locals>.<genexpr>;  s     BGQGs   	)_URL_REmatch	groupdictr/  rT   )rC   r$   mobjs      r5   _get_url_mobjYoutubeTabIE._get_url_mobj9  s<    ||!!#&002B

BBr8   c                    UR                  S5      =(       d    SR                  5       n[        U[        US5      5      nU=(       a    U R	                  U5      S   SS  =(       d    [        US[
        S9nU(       a  SS	0R                  XU5      U4$ U(       a  U R                  S
U 35        SSS.R                  X35      U4$ )Nrg   rs   )r  r   r   r$   r  r   r  r   TAB_ID_SPONSORSHIPS
membershipz#Falling back to selected tab name: featuredstreams)homelive)r+   r   r   r   r[  r   r  )rC   r  base_urltab_nametab_urltab_ids         r5   _extract_tab_id_and_name%YoutubeTabIE._extract_tab_id_and_name>  s    GGG$*113(LM%O P Et11':5A!"E K!#cJ 	%|c&!8, , B8*MN
 #h
!8, 	,r8   c                 2   ^ ^ [        U U4S jU 5       5      $ )Nc              3   R   >#    U  H  nTR                  U5      S    T:H  v   M     g7fr   N)rh  )r>   r  rC   rg  s     r5   r@   (YoutubeTabIE._has_tab.<locals>.<genexpr>U  s&     Sds4005a8FBdrB   )r=  )rC   r  rg  s   ` `r5   _has_tabYoutubeTabIE._has_tabT  s    SdSSSr8   c                 H    U R                   " / U40 U R                  X5      D6$ r<   )r  r  )rC   r  r  s      r5   _empty_playlistYoutubeTabIE._empty_playlistW  s&    ##Bc43S3ST[3bccr8   c                 @  ^ ^ T R                  U5      n[        R                  R                  [        R                  R	                  U5      R                  SS95      nT R                  S/ 5      nT R                  U5      nUS   US   US   US   (       + 4u  pgpU	(       a  UR                  S5      (       a  US S	 S
:X  a   T R                  SUS	S   3[        US	S  5      $ US S	 S:X  aL  T R                  SU 3USS9n
[        U
SS[        S9nU(       d  [        S5      eT R                  U[        5      $ US   S:X  a  T R                  SU U U 3[        U5      $ USS  U U 3pU	(       a  U(       d  SU;  a  U SU 3nUR                  S5      (       a  T R                  SU 35        [!        U5      mU4S jS 5       u  pU(       dX  US   R#                  S5      (       a?  U(       d
  [        SSS9eT R                  S U 35        T R                  S!U 3[        U5      $ T R%                  X5      (       d  T R                  S"U 3[&        U5      $ T R)                  X5      u  nn[        US#SS$9nU(       aM  SU;  aG  S%R+                  [-        S&U5      Xx45      nT R/                  S'U 35        T R                  U[        5      $ T R1                  U5      / nnU	(       Ga  U(       Ga  SU;  Ga  T R3                  U5      nT R5                  UU5      u  nnT R7                  S(U< S)U S*U< 35        US+:X  a  T R9                  UU5      $ U(       Gd  U(       Ga   T R/                  S,5        T R;                  US-5      (       a#  UR=                  S%R+                  US.U45      5        T R;                  US/5      (       a#  UR=                  S%R+                  US0U45      5        U(       d^  US1:w  aX  US S	 S2:w  a  T R9                  UU5      $ S3US	S   3nS!U 3n T R)                  UUUSSS49u  nnUUpT R/                  S5U S635        OOU(       a  US1:w  a  U U 3S nnO9U=(       d    S1U:w  a*  US7:X  a	  [?        US89eU(       a  [        S9U S:3SS9eU U 3nS;U;  a  T RA                  UUU5      =(       d    UnT RC                  USS<9  T R1                  U5      / nnU(       aM  T RE                  UUUU5      /nUS=   RG                  [        RI                  5       [        RJ                  US>.5        T R                  S?5      S@:X  a  URM                  U 4SA jU 5       5        O%URM                  [O        T RP                  U5      5        [S        U5      S:X  a  US=   $ U(       aY  T RU                  UU5      nSBn[W        USC 5      (       a  SDUSE   S	S   3nT R/                  SFU 35        T RX                  " UU40 UD6$ [        USG[Z        SH9nU(       a  T R]                  X1UUU5      $ [        USI[        SH9=(       d    UnU(       a4  USJ:w  a  T R                  SKU 35        T R                  S"U 3[&        U5      $ [        SL5      e! [         a    T R9                  UU5      s $ f = f)MNr'   r)   r  prer  r`  not_channelr&   r&  r  r   MPz"https://music.youtube.com/channel/	web_music)r  )r  r  urlCanonicalFr   z#Failed to resolve album to playlistchannel_typer  r   r  z/videosz8YouTube Music is not directly supported. Redirecting to c              3   @   >#    U  H  n[        TUS 45      v   M     g7frl  )r   )r>   r[   qss     r5   r@   -YoutubeTabIE._real_extract.<locals>.<genexpr>{  s      U}b3(!;!;}s   )r  rj  watchz&A video URL was given without video IDTr  zDA video URL was given without video ID. Trying to download playlist r   r   )r  .navigateActionr  r   r   r$   r   rs   r  zXThis playlist is likely not available in your region. Following conditional redirect to zSelected tab: z (z), Requested tab: aboutziDownloading all uploads of the channel. To download only the videos in a specific tab, pass the tab's URLra  z/streamsshortsz/shortsrS  UCUU)r  r  r  zQThe channel does not have a videos, shorts, or live tab. Redirecting to playlist z insteadrc  )r   zThis channel does not have a z tabzno-youtube-unavailable-videosr'  r   )extractor_key	extractorwebpage_urlr?  0c              3   P   >#    U  H  nTR                  U[        5      v   M     g 7fr<   )r   r   )r>   urC   s     r5   r@   r|    s     PZ4??1l;;Zs   #&zthe Uploads (UU) playlist URLc                 *    U S   R                  S5      $ )Nr   r  )rW   r   s    r5   r   ,YoutubeTabIE._real_extract.<locals>.<lambda>  s    1\?+E+Ed+Kr8   z(https://www.youtube.com/playlist?list=UUr   zeDownloading as multiple playlists, separated by tabs. To download as a single playlist instead, pass )r  rN  rO  rO  r   )r  r   r`   z/livez5Unable to recognize playlist. Downloading just video zUnable to recognize tab page)/r   r,   r-   r0   r.   r1   r  r[  r+   r   r   r  r   r   r   r<  r   rW   _yes_playlistr   r  joinr   	to_screenr  r  rh  r  rq  rn  r0  r   r  r  r  r/  r   IE_NAMEextendmap_real_extractrQ  r  r   r  rV   r`  )rC   r$   r3   r  r  rZ  rt  r  r`  
is_channelmdatamurloriginal_tab_idr  r   r   r  r  redirect_urlr  
extra_tabsr  selected_tab_idselected_tab_namepl_idpl_urlr:   r)  uploads_urlrO  r{  s   `                             @r5   r  YoutubeTabIE._real_extractZ  sQ   ..%ll%%LL!!#&//7H/IKnn]B7!!#&%)%[$u+tF|QUVcQdMd%d"$-++N;;r{d">wqr{mLl\cdedf\gi i!$228	BG\g 3 i#E+e,1F()NOOt\::n%18	#tfM|]df f '*!"g'3%/@c&C;&VE'C^,,"Z[^Z_ `a c] U} UD/::7CC$%MX\]]"fgrfs tu??8FVac c !!+88??28*=y(T T ((9e
 $  C  MRS9L77G,E|$TVY#`aLNNu  wC  vD  E  F??<>>66t<bj$#@#S55d;L151N1N|]`1a.O.~o-@CTBUUghwgz{| ')++GT::"'8  d e==y11%%bggsJ.E&FG==x00%%bggsIt.D&EF "o&Ar{d*#33GTBB !.EEeWMFA&*&8&8e[_os&8&te (-fopuovv~A  Ox$?#&%vC!-X/A"f, &w77&(+HHYY])^imnn dVn ++=77
D%PXTXD'''=33D92g..wtTJKGAJ!-!4!4!6)11" 
 >>*+s2NNPZPPNN3t11:>?w<11:77FH9Kx!KLL HR^I_`a`bIcHdeNNBBMPQ ''EHEE  Scgi..wT8USSFVY[ g^f 	g~##&[\d[e$fg??%EhZ#PR[]eff;<<E * C#33GTBBCs   Y> >ZZr   )r  )!r  r  r  r  IE_DESCformatr   _RESERVED_NAMESr  _INVIDIOUS_SITES
_VALID_URLr  intrj  r   r   r   rv  _TESTSclassmethodr   rL  compilerW  r[  rh  rn  rq  r   rJ   r  r  __classcell__rR  s   @r5   r   r     s   G	  
/??((3DDE 
 
! ( Gn&^,0 Z'-F&4U&)
	 n$ 8O,0 Z'-F4&U&)
	#nH $[,.AU$4)B%"O&)#'
Enl (H,3A*G.4U)&)
	knN EMnV /Y6,'*4U$+@'
 'Sn| !Y60"'4U&C*#
 #{n` R,&A"(!4AU4&)
 !_nB P,(A"(4U4A!&)
 !!And 0h,(A"(4A!4U&)
 !!cnF  S,+A"(A!U44&)
  !Enh S,'A!U44&)A("
  1#gnN T,<AU"O$4&)B)%#'
Knr Eqnx Nwn~ L}nF mY.6A'4U&$+'D
 'Cnl !O-,U("4$)#B
 "KL'knT 4@Sn\ hO6,4U+($/,H
  %[nD	 AY.6'AU4($F-(
 !KL)A	nl	 =O+, U4($%!>
 "KL'k	nV
 FY76A4U&$'+'D
  'S
n|
 U{
nB GeM%1A+,
 T
 /##%&'Anj _inp Gonv O
-
5
 S
 ;	

 3
 ,-
 D
 #
  
 z
 4
 
 #
 [
  
  I!
" H#
$ %U&)%(>%"#'&7
< T
 CCE#un| A7%1A,-w

 T
 !{n^ O]nd Acnj A>inr 7qnx 6wn~ 6}nD <CnJ :InP 89OnX HTWn` 0_nf 3enl <knr <qnx 7"

 !wnH vGnN |[MnV 8JUn` ?V6z.U(4*$H+/
 !KMvw)]nJ @J,>43U($4
 !GIvw%Gnt J,/

 mnD &C=G&(
 GHCnb 1Y6(&'*4U@'+
  [##8Y!D$1 J%
 " !4(K&_nn [9"

 !+fyk-BC
knH D[,*A#4U&)	
 !!+fyk-BC
 4%Gnp NJ,>(4U3$4
 !!+fyk-BC
 HIvw-mn\ <I[nd dY6'U&4"<;@'#
 ?'cnL &S,U-:4*@'+
 #i&4&1A%BC/0#Knt PY6U*4!($@'+
 #i&4&1A%BC/0+on^ B $&

  [nv O,6

  
qnH S,=

 	EnZ O,6

 	Wnn J,0&)4UA2A3(#'
 %inT >,.UA&)4'C(*#'
  %Onx R,*4U%&)AF-&
  !un\ J	Wnf .	anp 5,,4%A&)UK&2
  #knR 7%

  e
Onf k

  	cn| Q,1*-4U@'+
 #C#&!"	
  "4(;unv O,6
 #D(!"), #"'+
 $ $(3?9qnp S,3*-4U@'+
 &Q08$&Y"*-"%' D+'+
 & "4(&I%knx < "O"&)4$UAB)%#'
 #un\ M,4PA/'&)U&7
 !Yn@ <,"?+&#47U&)#'
  %{nh P,U)B4%&$(0
 !KL+anP  )I,#4!&)A(A$U#''
M n|  x; ,"4'&)A'@#U
y nF`! K K jjHZL0abcG
,,Td !::Y= ;Y=r8   r   c                   L  ^  \ rS rSrSrSR                  \R                  SR                  \R                  5      S9r
SrSSS	SS
SS\SSSS
/ SSS.SS.SSSS.SSS.SSSSSS S!S"S#/ S$\S S%S&SS'./ S(QS).S*S+S,S-S.S/S0S.\S1/ S2S3SSS4.S5/S6.S7S8S9.S:S8S9./r\U 4S; j5       rS< rS=rU =r$ )>r   i  zYouTube playlistsa  (?x)(?:
                        (?:https?://)?
                        (?:\w+\.)?
                        (?:
                            (?:
                                youtube(?:kids)?\.com|
                                {invidious}
                            )
                            /.*?\?.*?\blist=
                        )?
                        (?P<id>{playlist_id})
                     )r  )r   r  zyoutube:playlistz
issue #673PLBB231211A4F62143zTeam Fortress 2 [2010 Version]zWickman Wishz@WickmanWishz$md5:8fa6f52abb47a9552002fa3ddfc57fc2z$https://www.youtube.com/@WickmanWishr  zUCKSpbfbl5kRQpTdL7kMc-1Qz8https://www.youtube.com/channel/UCKSpbfbl5kRQpTdL7kMc-1Qr   )rg   r   r   r   r   r   r   r)  r   r   r  r   r      r  "PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlYDL_safe_search)rg   r   r&  zThis playlist is private)r$   rD   r   r  embeddedzQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEur  JODA15"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEumilanz
@milan5503rs   z8https://www.youtube.com/channel/UCEI1-PVPcYXjB73Hfelbmaw20140919zUCEI1-PVPcYXjB73Hfelbmawz"https://www.youtube.com/@milan5503)rg   r   r   r   r   r   r  r)  r   r   r   r   r   )z.[Uu]navailable videos? (is|are|will be) hiddenRetryingz	Giving up)r  r$   r   rD   r  zPhttp://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIli  z'2018 Chinese New Singles (11/6 updated)"PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIlLBKz@music_kingz$md5:da521864744d60a198e3a88af4db0d9dz8https://www.youtube.com/channel/UC21nz3_MesPLqtDqwdvnoxAz#https://www.youtube.com/@music_kingUC21nz3_MesPLqtDqwdvnoxA)rg   r   r   r   r   r   r   r   r  r   r   r)  r   r  )r$   r  rD   r  TLGGrESM50VT6acwMjAyMjAxNwTr  )OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMc                    > [         R                  U5      (       a  gSSKJn  U" U5      nUR	                  SS /5      S   (       a  g[
        TU ]  U5      $ )NFr   )r   r  )r   r   yt_dlp.utilsr   r+   rP  )rQ  r$   r   r{  rR  s       r5   r   YoutubePlaylistIE.suitableX	  sK      %%)c]66#vq!w$$r8   c                     U R                  U5      n[        R                  " U5      n[        S[	        U5      =(       d    SU05      nU(       a  [        USS05      nU R                  U[        R                  5       US9$ )Nz https://www.youtube.com/playlistrj  r&   Tr   )	r   r   r&   r   r   r   r   r   r   )rC   r$   r   r&   s       r5   r  YoutubePlaylistIE._real_extractb	  sr    nnS)/<<SA.SM2fk24 cND#9:Cs|':':'<{SSr8   r   )r  r  r  r  r  r  r   _PLAYLIST_ID_REr  r  r  r  r  r  r  r   r  r  r  r  s   @r5   r   r     sj   !G !&,<<((3DDE !   !G #5&&)AB(4%U$
  '* 4&6
 * b6'U'4@$
 j). b >6(AUA4($
 LL'* ,
 ;QLF\ % %T Tr8   r   )&rH   r  rL  r  urllib.parser,   _baser   r   _videor   networking.exceptionsr   r	   utilsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r5   <module>r     sl      	   6  B     0F": FRI=. I=Z(rT0 rTr8   