
    Şi"                       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 ddl	m
Z
 ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"  G d d	e          Z# G d
 de#          Z$ G d de          Z%dS )    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                   Z   e Zd Zed             Zed             Zd Zd Zd Zd Z	d Z
d&d	Zd
 Zd Zd Zd Zd Zd Zd Z	 d Zd Zd Zed'd            Zed             Zd Zd Zd Zd Zd Zeefd            Zd Ze j!        d             Z"d'dZ#d'd Z$d(d#Z%d)d$Z&d!Z'e(d"fd%Z)d!S )*YoutubeTabBaseInfoExtractorc                 P     d t          j                    fd            }|S )Nc                    |                      d          dvr| S |                     d          ryt          j                            | d                   }|j        dv rK|                    d           t          j                            |                    d                    | d<   |rt          | d         |          | d<   | S )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      bC:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/extractor/youtube/_tab.py_smugglezGYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>._smuggle%   s    xx  (BBB  00 k#\224;??
$(PPP!%%n555"(,"9"9*:M:MUh:M:i:i"j"jDK F)$u+}EEUK    c                     t          |i           \  }|                     |          rdd<    | |          }r9 |           |                    d          rfd|d         D             |d<   |S )NTr%   entriesc              3   T   K   | ]"} |                                           V  #d S N)copy).0ir5   r2   s     r4   	<genexpr>zYYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper.<locals>.<genexpr>:   s<      +l+lRSHHQ8J8J8L8L,M,M+l+l+l+l+l+lr6   )r   r%   r*   )selfr#   	info_dictr2   r5   funcs      @r4   wrapperzFYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper1   s    !.sB!7!7C  %% 504n-T366I mM222==++ m+l+l+l+l+lW`ajWk+l+l+lIi(r6   )	functoolswraps)rA   rB   r5   s   ` @r4   passthrough_smuggled_dataz5YoutubeTabBaseInfoExtractor.passthrough_smuggled_data#   sO    
	 
	 
	 
				 		 		 		 		 
			 r6   c                     d}|                                  D ]Q\  }}t          |t                    s||v r|c S |                    d          r|                    d          r|c S Rd S )N)playlistRenderervideoRendererchannelRenderershowRendererreelItemRenderergridRenderer)items
isinstancedict
startswithendswith)itemknown_basic_rendererskeyrenderers       r4   _extract_basic_item_rendererz8YoutubeTabBaseInfoExtractor._extract_basic_item_renderer>   s    !
 "ZZ\\ 	  	 MCh--  ---''  CLL,D,D  	  	 r6   c                    |                     d          }t          |d          }|                     |dd          p|                     |d          }|                     |d          }t          |                     d                    }|$t	          |                     |dd	                    }|=t	          |                     d
t          |ddt                    |d d                    }t          |dt          d          }|st          |d          }|                     |          }t          |ddt                    }|                     t          |d                    }	|                     t          |d                    }
t          dt          |dt                              pd}d| }|dk    sd|v rd| }|                     |dd           p|                     |d!          pd}t          t          |d"d#                    }|d$nAd%|                                v rd&n)|d'k    s |                     |	t          j                  rd(nd }|                     |d)d*d           pd}d+|                                v rd,n|                     d-|i          }|d.v rd/nd0}|                     |d1d2          p|                     |d3          }t          |d4| j        d          }i d5d6d7t#          j                    d8|d6|d|d9|d|d:|d;|d<|rd=| nd d>|d?|d@t'          |d dAd B          dC|                     |dD          dE|                     dFt,          G          r|                     |          nd dH|dI|                     |	t          j                  rdJn|                     |                     |	t          j                  pd |                     |	t          j                  pd |                     |	t          j                  pd |                     |	t          j                  pd K          ||dL|dM|                     |
t          j                  rdNnd iS )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)?$)r`   accessibilityaccessibilityDatalabel )defaultexpected_typeduration)rm   group)shortBylineTextruns.rZ   browseEndpointbrowseIdF)rn   get_all)channelNavigationEndpointrs   rt   )rf   .rg   styleru   rn   badgesownerBadgeshttps://www.youtube.com/)rZ   commandMetadatawebCommandMetadatar#   rn    https://www.youtube.com/watch?v=SHORTSz/shorts/https://www.youtube.com/shorts/publishedTimeText	videoInfotimestampText)upcomingEventData	startTimeru   is_upcomingstreamedwas_liveLIVEis_liveviewCountTextshortViewCountTextzno viewsr   
simpleText)r   r   concurrent_view_count
view_count	ownerTextrq   channelTitleText)rq   rr   .rZ   )r|   r}   r#   )rs   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rm   
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)r?   rV   video_idreel_header_rendererr`   r   ro   r   overlay_stylery   owner_badgesnavigation_urlr#   	time_textscheduled_timestampr   view_count_textr   view_count_fieldr   channel_handles                        r4   _extract_videoz*YoutubeTabBaseInfoExtractor._extract_videoL   s   <<	**+H 7N  O  O x*==vPdfuAvAvnnX/CDDx||O<<==%dnn,(p'r 'r s sH%d&8&8pX'_ik{~$j '9 ': ': ; ;H
 "ju. . .
  	y%&:<wxxJ&&z22
$_. . . %%l8X&F&FGG++L=,Q,QRR !;\\> > >     &#% 	 <;;H$$
n(D(D>H>>C^^H.A;OO T';_MMTQS 	(h@blq)r)r)rss 1<MM)Y__->->>>+v55QZQc9d9d5	 	 ..?DXZeffljl%)>)>)@)@@@aa??L/+JKK 	6AE_6_6_22eq>>(K9JKK Onn%9;MNN 	 &h 1h .? ? ?
U
i&((
 (
 3	

 U
 ;
 
 *
 w
 jbJjJJJ^b
 
 >
 L?[eijjj
 $228[II
 !445GP\4]]$$//	:::##
$  !4%
&  OOFI4QRR b''#vy7UVV^Z^"&//&):X"Y"Y"a]a'+vy?b'c'c'kgk $	8W X X `\`	 ( b b+
4 j;!4??<I[+\+\#f44bf9
 
 	
r6   c           
      J   |                      |d                   }|                     |d          }t          |d dd           }|                     t	          |ddt
          hfd                    }|s)|                     |                     |d	                    }i d
dd|d|dt                                          d|d|d|d|d|d|dt          |d dd           dt	          |d	d| j	                  d| 
                    |d          d| 	                    |d	          | 	                    |d          nd d|                     |d          d|                     |                     t	          |d                    t          j                  rdnd S ) N	channelIdr`   "https://www.youtube.com/channel/%sr   rZ   r   Fr   subscriberCountTextr"   r#   r   r   r   r   r   r   r   r   r   channel_follower_countvideoCountTextr~   r   r   playlist_countr   rc   r   rz   T)r   r   r   r   r   r   handle_or_noner   r   r   r   r   r   r   r   )r?   rV   r   r`   r   r   s         r4   _extract_channel_rendererz5YoutubeTabBaseInfoExtractor._extract_channel_renderer   sD   &&x'<==
x11":t5Ycghhh--$ 'O$ !&' ' '( (
  	b!00J_1`1`aaN
U
;
 *
 l))++	

 u
 
 *
 ;
 U
 >
 L?[eijjj
 %l/1AQUQ`'b 'b 'b
  $228[II!
"  ??8-BCCO *:;;;UY)
* 4>>(4HII+
, "4??$$\(M%J%JKKYM_,a ,a $k44fj/
 	
r6   c           	   #     K   |d         D ]}t          |t                    st          |dt          hf          x}r|                     |          x}r|V  O|                     |          }t          |t                    sz|                     |d          }|                    d          }|r6|                     d| t          	                                ||          V  |                    d          }|r| 
                    |          V  |                    d          }	|	r|                     |          V  =t          d	t          |d
 t                              }
|
rnt          t          t           fD ]Y}|                    |
          rB|                     |
|	                                |                    |
          |          V   nZd S )NrN   lockupViewModelr`   
playlistId&https://www.youtube.com/playlist?list=ier   video_titlerY   r   r{   c                 6    | d         d         d         d         S )NrZ   r|   r}   r#    xs    r4   <lambda>z;YoutubeTabBaseInfoExtractor._grid_entries.<locals>.<lambda>   s    A&:$;<M$NOc$dej$k r6   )rO   rP   r   _extract_lockup_view_modelrW   r   r*   
url_resultr   r   r   r   r   r   r   YoutubePlaylistIEr   suitable	_match_id)r?   grid_rendererrS   lockup_view_modelentryrV   r`   playlist_idr   r   ep_urlr   s               r4   _grid_entriesz)YoutubeTabBaseInfoExtractor._grid_entries   s?     !'* (	 (	DdD)) $08ID67R$S$SS   ;;<MNNN5  KKK88>>Hh-- NN8W55E #,,|44K ooJ[JJ#**,,{ % & ' ' ' ' ' ||I..H ))(33333!k22J 44X>>>>>7kk: :  F  '):IF  B{{6** "oo"ryy{{R\\&=Q=Q_d . f f f f fK(	 (	r6   c                 B   t          |d          }|r=t          |d          }|                     d| t          j                    ||          S t          |d          }|ryt          |d          }|r5|                     d| d| t                                          |          S |                     d	| t                                          |          S t          |d
          }|r2|                     d| t                                          |          S d S )N)playlistItemDatarY   )flexColumnsr   )musicResponsiveListItemFlexColumnRendererrh   rr   r   rh   z"https://music.youtube.com/watch?v=)r   r   r`   )rZ   watchEndpointr   )rZ   r   rY   z&list=r   r   (https://music.youtube.com/playlist?list=)rZ   rs   rt   z!https://music.youtube.com/browse/)r   r   r   r   r   )r?   rV   r   r`   r   	browse_ids         r4   _music_reponsive_list_entryz7YoutubeTabBaseInfoExtractor._music_reponsive_list_entry   s{   *IJJ 	Z  ,+ , ,E ??#R#R#R&/&6&8&88SX # Z Z Z"8-bcc 	S#H.`aaH W'iH'i'i\g'i'i*6*=*=*?*?+ ' W W W??#[k#[#[&2&9&9&;&;k # S S S +_``	 	Q??#Ry#R#R&2&9&9&;&;i # Q Q Q	Q 	Qr6   c              #   "  K   |                     d          }t          |t                    sd S |                     d          p|                     d          }|r|                     |          E d {V  |                     d          }|rd S d S )NcontentgridRendererexpandedShelfContentsRendererhorizontalListRenderer)r*   rO   rP   r   )r?   shelf_rendererr   rV   s       r4   _shelf_entries_from_contentz7YoutubeTabBaseInfoExtractor._shelf_entries_from_content  s       $$Y//'4(( 	F;;~..^'++>]2^2^ 	4 ))(333333333;;788 	D	 	r6   Fc              #      K   t          |d t                    }t          d|          }|r7|rd|v rd S |                     |d          }|                     ||          V  |                     |          E d {V  d S )Nc                 6    | d         d         d         d         S Nendpointr|   r}   r#   r   r   s    r4   r   z<YoutubeTabBaseInfoExtractor._shelf_entries.<locals>.<lambda>"  s    a
m4E&FG[&\]b&c r6   https://www.youtube.comz
/channels?r`   )r   )r   r   r   r   r   r   )r?   r   skip_channelsep	shelf_urlr`   s         r4   _shelf_entriesz*YoutubeTabBaseInfoExtractor._shelf_entries   s      cc  5r::	 	@  !:!:NN>7;;E//)/?????33NCCCCCCCCCCCr6   c              #   *  K   |d         D ]}t          |t                    s|                    d          p|                    d          }t          |t                    sX|                    d          }|sp|                     |          V  d S )NcontentsplaylistVideoRendererplaylistPanelVideoRendererrY   )rO   rP   r*   r   )r?   video_list_rendererr   rV   r   s        r4   _playlist_entriesz-YoutubeTabBaseInfoExtractor._playlist_entries0  s      *:6 		0 		0Ggt,, {{#:;;hw{{Kg?h?hHh-- ||I..H %%h//////		0 		0r6   c                 t    |                     d          }|sd S |                     d          }|dk    rt          }d| }d}n>|dv rt          }d| }d}n+                     d	| d
t	                       d           d S                      |||t          |ddddt          hf                               |dg|ddR d          t          |ddddddddt          ht          f
                               dt                    r%t          |dddddddddd fd ht          f          nd !          S )"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lockupMetadataViewModelr`   r   contentImagethumbnailViewModelimagesources	final_keyoverlays.))thumbnailBottomOverlayViewModelry   )thumbnailOverlayBadgeViewModelthumbnailBadgesthumbnailBadgeViewModelrh   r   r   contentMetadataViewModelmetadataRowsmetadataPartsc                 2                         | d          S )NF)report_failure)r   )tr?   s    r4   r   zHYoutubeTabBaseInfoExtractor._extract_lockup_view_model.<locals>.<lambda>\  s    I^I^_`qvI^IwIw r6   )r`   r   ro   r   )r*   r   r   report_warningr   r   r   r   r   r   anyr   )r?   
view_model
content_idcontent_typer   r#   
thumb_keyss   `      r4   r   z6YoutubeTabBaseInfoExtractor._extract_lockup_view_model<  s   ^^K00
 	F!~~m44666BAZAAC JJ\\\BG:GGCMJJe|eeNaNcNcee         FZz5w	C5,R S S//
=L!+=L-A=LCJ=L =LW` 0 b b!* 4j#v.8H#/O P P **+=l*SS^|J5zC]_m_c69?w?w?w?w>xz}1 @ @ @ Z^  ` ` 	`r6   c              #     K   t          |ddt          hf          x}r|                     |          x}r|V  d S t          |ddt          f          pi }|                    d          }|r|                     |          V  d S |                    d          }|rK|                     d| t                                          || 	                    |d                    V  d S |                    d	          }|rt          |d
dddt          hf          }|sd S  | j        d| ft          |dt          |dddt          hfdd hdfft          fdddt          hfd          d|                     |dd          iV  d S d S )Nr   r   )rH   rK   rG   shortsLockupViewModelrY   r   r   r`   r   entityIdonTapinnertubeCommandr[   r   r   overlayMetadataprimaryTextaccessibilityTextc                 ,    t          j        d|           S )Nz:(.+), (?:[\d,.]+(?:[KM]| million)?|No) views? - play Short)re	fullmatchr   s    r4   r   z;YoutubeTabBaseInfoExtractor._rich_entries.<locals>.<lambda>~  s"      GD  FG  :H  :H r6   r   secondaryText)r`   r   r   )r  r  r  r  r  )r   rP   r   r-  r*   r   r   r   r   r   r   r   r   r   )r?   rich_grid_rendererr   r   rV   r   r   	entity_ids           r4   _rich_entriesz)YoutubeTabBaseInfoExtractor._rich_entries_  ss      ,-?)M^ae`fAg h hh 	778IJJJu Fjlopr r xuw 	 <<	** 	%%h/////Fll<00 	//FFF&&((; NN8W== " ? ? ? ? ? FLL,,	 	#Hw8JL_ajmplq.rssH !$/<(<<
kx
k 
k x*M9seL,  0H  0H  /I  KL  MN PST $5oyS^R_"`	* *  
k 
k  33S_h 4 j j
k 
k 
k 
k 
k 
k F	 	r6   c                 ^    |                     d          }|r|                     |          S d S )NrY   )r*   r   )r?   video_rendererr   s      r4   _video_entryz(YoutubeTabBaseInfoExtractor._video_entry  s;    !%%i00 	7&&~666	7 	7r6   c                     t          dt          |d                    }|rC|                     |t                                          |                     |d                    S d S )Nzhttps://youtube.com)onTapCommandr|   r}   r#   hashtag)r   r`   )r   r   r   r   r   r   )r?   hashtag_tile_rendererr#   s      r4   _hashtag_tile_entryz/YoutubeTabBaseInfoExtractor._hashtag_tile_entry  s    +\!#c.e .e f f 	g??++--T^^DY[d5e5e # g g g	g 	gr6   c              #     K   t          |d t                    }|sd S t          |d t                    pi }|                    d          }|r|                     |          }|r|V  t          |d t                    }|r4|                     d| t                                          |          V  t          |d t                    pg }|D ]}t          |t                    st          |d t                    }	|	s2t          j        |	          sGt          j        |	          }
||
k    rb|                     |	t          j                    |
          V  d S )	Nc                     | d         d         S )NpostbackstagePostRendererr   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    AfI6M,N r6   c                     | d         d         S )NbackstageAttachmentrH   r   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    Q'<%=o%N r6   rY   c                 *    | d         d         d         S )NrN  rG   r   r   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    Q'<%=>P%QR^%_ r6   r   r   c                     | d         d         S )NcontentTextrr   r   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    -0@0H r6   c                 *    | d         d         d         S )NrZ   urlEndpointr#   r   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    q!56}EeL r6   )r   rP   r*   r   r   r   r   r   listrO   r   r   r   )r?   post_thread_rendererpost_rendererrB  r   r   r   rr   runr   ep_video_ids              r4   _post_thread_entriesz0YoutubeTabBaseInfoExtractor._post_thread_entries  s      "N"NPTV V 	F NNPTV V \Y[ 	!%%i00 	''77E __adf f 	@//FFF&&((; " @ @ @ @ @ }&H&H$OOUSU 	W 	WCc4(( LLcS SF %f-- #-f55K;&&//&Y-=-?-?+/VVVVVV	W 	Wr6   c              #   z  K   |                     d          }t          |t                    sd S |D ]}|                     d          }t          |t                    r|                     |          E d {V  H|                     d          }t          |t                    r|                     |          V  d S )Nr	  backstagePostThreadRendererrH   )r*   rO   rT  rP   rY  rC  )r?   post_thread_continuationr	  r   rV   s        r4   !_post_thread_continuation_entriesz=YoutubeTabBaseInfoExtractor._post_thread_continuation_entries  s      +//
;;(D)) 	F 	2 	2G{{#@AAH(D)) 44X>>>>>>>>>{{?33H(D)) 2''11111	2 	2r6   c              #      K   t          |d          D ]-}|                     t          d|          t                    V  .d S )N)rows.reportHistoryTableRowRenderercells.reportHistoryTableCellRenderercell"reportHistoryTableTextCellRendererrh   rr   .rZ   r|   r}   r#   r  )r   r   r   r   )r?   rV   r#   s      r4   _report_history_entriesz3YoutubeTabBaseInfoExtractor._report_history_entries  sa       +V W W 	V 	VC //'*CS"I"I9UUUUUU		V 	Vr6   c              #      K   d gd d <   t          |d t                    pg }|D ]}t          |t                    st	          |dddt                    }|s|                    d          r;                     |d                   D ]}|V                       |          d<   nX|                    d          rCt	          |d	          }                     |          E d {V                       |          d<   t          |d
 t                    pg }|D ]}	t          |	t                    s j	         j
         j
         j         fd j         fd fd fd fd fd fdd}
|	                                D ]<\  }}||
vr
 |
|         |          D ]}|r|V  	                     |          d<    d         s                     |          d<   d         s                     |          d<   d S d S )Nc                     | d         S Nr	  r   r   s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s
    a
m r6   itemSectionRenderermusicShelfRenderermusicShelfContinuationr~   richItemRendererr   reportHistorySectionRenderer)rm  tabletableRendererc                     | d         S rh  r   r   s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s
    !J- r6   c                 0                         |           gS r:   )r   r   r?   s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s    $BbBbcdBeBeAf r6   c                 0                         |           gS r:   )rC  rr  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s    0A0A!0D0D/E r6   c                 8                         dd| igi          S )NrN   rG   r   rr  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s$    $2D2DgQcefPgOhEi2j2j r6   c                 8                         dd| igi          S )NrN   rI   ru  rr  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s$    1C1CWPacdOeNfDg1h1h r6   c                 0                         |           gS r:   )rH  rr  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s    d6N6Nq6Q6Q5R r6   c                 0                         |           S r:   _extract_entriesr   continuation_listr?   s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s    $2G2GK\2]2] r6   c                 0                         |           gS r:   )r   rr  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s    $2Q2QRS2T2T1U r6   )playlistVideoListRendererr   reelShelfRenderershelfRenderermusicResponsiveListItemRendererr[  rH   rG   rI   hashtagTileRendererrichGridRendererr   )r   rT  rO   rP   r   r*   r@  _extract_continuationre  r  r   r  rY  rN   )r?   parent_rendererr|  r	  r   is_rendererr   rn  isr_contentsisr_contentknown_renderersrU   rV   s   ` `          r4   rz  z,YoutubeTabBaseInfoExtractor._extract_entries  s      $v!!!?,C,CTJJPb .	O .	OGgt,, &.0DF^"$ $ $K  	;;122 M!%!3!3G<N4O!P!P $ $#+/+E+Eo+V+V%a(([[!?@@ M(2lmmE#;;EBBBBBBBBB+/+E+Ee+L+L%a(";0G0GNNTRTL+  !+t44  261G$($6)-);%)%87f7f7f7f373L%E%E%E%E(j(j(j(j'h'h'h'h+R+R+R+R(](](](](]'U'U'U'U# # &1%6%6%8%8  MC/11 !5!5h!?!? ( (  ("'KKK+/+E+Eh+O+O%a($Q' O'+'A'A+'N'N!!$ # 	O#'#=#=o#N#Na   	O 	Or6   c              #      K   d g fd}t          |d t                    }|sd S t          |d t                    pt          |d t                    pi } ||          E d {V  d         }	t                      }
t          j        d          D ]}|	s d S |	                    d          }|||
v r                     d            d S |
                    |                                |||	          } 	                    | d
| |	||ddddddddd ff          }|s d S d }	 
                    |          p|} j        df j        df j        df j        df j        df|df|df j        df j        df j        d f j        d f j        d f|d f j        dfd}t          |ddd          }t          |dd t          i           }d }|D ]K}||vr||         \  }}|r||in|}d g ||          E d {V  d         p                     |          }	L|	p                     d|gi          }	|	s|s d S d S )Nc                 0                         |           S r:   ry  r{  s    r4   r   z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>  s    D$9$9!=N$O$O r6   c                     | d         S )Nr   r   r   s    r4   r   z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>  s
    Qy\ r6   c                     | d         S )NsectionListRendererr   r   s    r4   r   z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>  s    1-B+C r6   c                     | d         S )Nr  r   r   s    r4   r   z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>  s    a0B.C r6   r   r   continuationz5Detected YouTube feed looping - assuming end of feed.ytcfgdelegated_session_idvisitor_data page continuationContentsonResponseReceivedActionsonResponseReceivedEndpointsresponseContextserviceTrackingParams.paramsc                     | dk    o|dk    S )NrU    GetRecommendedMusicPlaylists_ridr   )kvs     r4   r   z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>&  s%    bcglbl  cYqr  wY  rY r6   )item_idqueryheadersr  check_get_keysrN   r	  r_  )rH   gridPlaylistRenderergridVideoRenderergridChannelRendererr
  ri  rl  r[  r`  playlistVideoListContinuationgridContinuationitemSectionContinuationsectionListContinuationr   ))r  r  .appendContinuationItemsActioncontinuationItemsFr   )rn   rm   )r   rP   set	itertoolscountr*   write_debugaddgenerate_api_headers_extract_response_extract_visitor_datar   r  r]  re  r   r  )r?   tabr  r  r  r  extract_entriestab_contentr  r  seen_continuationspage_numcontinuation_tokenr  responser  continuation_itemscontinuation_itemvideo_items_rendererrU   rA   
parent_keyr|  s   `                     @r4   _entriesz$YoutubeTabBaseInfoExtractor._entries
  s     !FOOOOOc#9#94@@ 	FK!C!CTJJ Q{$C$CTJJQNP 	 #??333333333(+ UU!** C	 C	H !-!1!1.!A!A!-2DHZ2Z2Z  !XYYY""#5666//2FUa 0 c cG--"44(44"G5*,GIf&(?hPS  VY  VY  Z  .  H  L  55h??O<L #'"4g!>)-);W(E&*&8'%B(,(:G'D*.*@*)M(7'D%4j$A040VXb/c262NPV1W262H$1O%)%7$>,0,RTX+Y,;T+B$($6#@ O" ".h 9 &u"6 "6 "6 !--?DX\fh i i i#' ( h ho--#23#7 jKU'm
4F'G'G[m$%)F!4 455555555503gt7Q7QRf7g7g (h4+E+EzTeSfFg+h+hL (< GC	 C	r6   Tc                 d    | D ]}|                     d          r|c S |rt          d          d S )NselectedzUnable to find selected tab)r*   r   )tabsfataltab_renderers      r4   _extract_selected_tabz1YoutubeTabBaseInfoExtractor._extract_selected_tab[  s\      	$ 	$L
++ $####$ 	@ !>???	@ 	@r6   c                 0    t          | dt                    S )N)r	  twoColumnBrowseResultsRendererr  .)tabRendererexpandableTabRendererr~   )r   rP   )r  s    r4   _extract_tab_renderersz2YoutubeTabBaseInfoExtractor._extract_tab_renderersc  s*    {  LPQ Q Q 	Qr6   c                 z   |                      ||          }|                     |          }|dxx         t          |dd          z  cc<   |dxx         t          |dd          z  cc<    | j        |                     ||d         ||                     ||          |                     ||                    fi |S )Nr`   z - %sexpandedTextr   )_extract_metadata_from_tabsr  r   playlist_resultr  _extract_delegated_session_idr  )r?   r  r  datar  r  selected_tabs          r4   _extract_from_tabsz.YoutubeTabBaseInfoExtractor._extract_from_tabsh  s    33GTBB11$77\,III\,PPP#t#MMhtne225$??**4779 9 
   	r6   c                 H   d|i}t          |dt                    }|r`t          |d| j        hfd| j        hf          }|                    |                    d          |d           |d         r|d         |d<   nt          |d	t                    }t          |d
dddt          hf          }d }|                     |d          }|r2 ||d         d                   }	|	r|                    |	ddd           |                     |d          p|                     |dd          }
|
D ]}d|d<   |
r2 ||
d         d                   }|r|
                    |ddd           |                     |d          }t          |dt                    }|                     |d          }|                     |d           }|                    t          |d          p| 	                    |d!          p|d         | 
                    |          |                     |d"          p%t          |d#d$d%d&d'd( d)dt          ht          f
          t          |d*           t          |d+d,d-d&t          hf          pt          |d.d/ hd&f          |p||z   |
z   d0           t          |d1| j        hfd23          pt          |d
d&d4| j        hfd23          }|r)|                    |t%          |d d5d 6          d7           |                     t          |d8d23                    }|                     |t*          j                  rd9|d:<   t/          ||fd;          }|                     | 	                    |d<          p| 	                    |d=                    }t3          |          |d><   |                     |d          |d?<   |d?         |                     |d@          |d?<   |d?         |                     |dA          |d?<   |                     |d          |dB<   |dB         |                     |dC          |dB<   |                    d          st          |dD          }|s$t          |                     |dE          dF          }| 	                    |          }t          |dG          pi }|                    |                     dH|dI|6          |                     |                    dJ                    |                     t7          dK|                    dL                              dM           |                    |dN         t%          |                    d          d dOd 6          t%          |                    dP          d d5d 6          dQ           |S )RNr   )r  channelMetadataRendererr~   
externalId
channelUrlr`   )r   r   r   r  playlistMetadataRendererheaderpageHeaderRendererr   pageHeaderViewModelc                 \    t          | pd                    d          d         dz             S )Nrl   =r   z=s0)r   split)r#   s    r4   _get_uncroppedzOYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>._get_uncropped  s,    	r0055a85@AAAr6   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  hashtagHeaderRendererrF  )r  .r   r  r&  r'  .r(  c                 "    d|d         d         v S )Nsubscribersrh   r   r   _r  s     r4   r   zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    !F)I2F!F r6   rh   c                 .    |                      dd          S )Nr   rl   )r*   r   s    r4   r   zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    mUW@X@X r6   microformatmicroformatDataRenderertagskeywordsc                 .    | ot          j        |           S r:   )shlexr  r   s    r4   r   zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    PQPdV[VabcVdVd r6   )r`   r   r   r   r  r   )vanityChannelUrl)	ownerUrls.Fr   channelHandleTextr   r   )r   r   )r  .ry   Tr   ))stats
briefStatsnumVideosText   )byliner   playlistBylineRendererrh   modified_dater   r   )r	  r  r  .r  r   r  r	  .ri  r	  . channelAboutFullMetadataRendererr   r   )r  r   r  rh   r   $playlistSidebarSecondaryInfoRenderer)
videoOwnervideoOwnerRendererr`   )rr   r   rZ   rs   z^by (.+) and \d+ others?$r   rt   r  r   )r   r   r   r   r   r   )r   r   r   )r   rP   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   )r?   r  r  r1   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                           r4   r  z7YoutubeTabBaseInfoExtractor._extract_metadata_from_tabsv  s.   g(/Vfjkkk 
	q%&7,IZH[9\'3d6H5I&JL LJKK,0099(     L! 0!,/T
 ,T3[ko p p p ".d*I7Ltf5V "W "W
	B 	B 	B !445FQQ 	-~.?.B5.IJJ !((+,"#* *    $$T+bcc j''&(S_h ( j j 	 & 	' 	'F#&F<   	-~oa.@.GHH &&+,"$( (    $(#F#FtMq#r#r #/6Zjn#o#o#o !55$  'PQ Q"66$&ln n 	"#4g>> $.\]]$d 66t<<&LMM p 6 :NCQ`FFPY\g[hjm9o p p ##46X6XYY!$8QSY[^ad`e(fgg m$%6FdFdEegj8kll-D1DHYY\kk
 
 	 	 	" *-UX\XlWm,nx}~~~ nD8S2EH[G\"]glmmm 	  	KK- ,^TC_im n n n    
 --l4AZdi.j.j.jkk??>9+=>> 	/*.D&' #%'?@Bnp p !11NN>1-- i~~68ghhj j !11B C C_!__^Q??\%!%1I?![![D%!% 8~ " "D "&!C!C !)%)__5MO~%%D!"xx%% 	 !9;GGE C$77>deeAC C ..J$U,_``fdfIKK--.JJXblv-ww"//	j0I0IJJ#33G<UW`WdWdewWxWx4y4yzz     	Y'(>(>Fjtxyyy(-)@)@$Hdnrsss
 
 	 	 	 r6   c           
   #   0  K   d x}x}t          j        d          D ]v}t          |                     |                    }|s d S t	          fdt          |          D             d          dz   }	|	t          |          k    r d S ||	d          E d {V  |p|d         d         }|d         d         t          |d           }
|                     || 	                    ||          | 
                    |||                    }||
                    d          p|
                    d	          pt          |          |
                    d
          pdd}|                     | d| |d||d          }t          |d t                    }xd S )Nr   c              3   :   K   | ]\  }}|d          k    |V  dS )r   Nr   )r<   r=   r  last_ids      r4   r>   zGYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<genexpr>  s5      PP1QtW=O=O!=O=O=O=OPPr6   r   r   c                 B    | d         d         d         d         d         S )Nr	  r$  r  rZ   r   r   r   s    r4   r   zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>  s!    AjM"$56R$STh$ijy$z r6   r  rY   indexr  zOAE%3D)r   rY   r&  r  r  nextr	  )r  r  r  r  r  r  c                 6    | d         d         d         d         S )Nr	  twoColumnWatchNextResultsplaylistr   r   s    r4   r   zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>  s    AjM2M$Nz$Z[e$f r6   )r  r  rT  r  r'  	enumeratelenr   r  r  r  r*   r  rP   )r?   r*  r   r  r  first_idr  r  videosstartwatch_endpointr  r  r#  s                @r4   _extract_inline_playlistz4YoutubeTabBaseInfoExtractor._extract_inline_playlist  s     (,,,7X!** 	n 	nH$00::;;F PPPP	&(9(9PPPRTUUXYYEF##eff~%%%%%%%26!9T?HRj&G$zz| |N//$2T2TUZ\`2a2a!77$NN 0 P PG *)--i88CG'++G44CF(,,X66B(	 E --&88h88u) .  H
 ffhln nHH5	n 	nr6   c                    |                     d          pt          |d t                    }|                     d          p|}t          |t          |d t                              }t	          j        d|          }	|r8||k    r2|	s0|                     |t                                          ||          S | 	                    | 
                    ||||          ||          S )Nr`   c                     | d         d         S )N	titleTextr   r   r   s    r4   r   zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>  s    AkN<8 r6   r   c                 6    | d         d         d         d         S r  r   r   s    r4   r   zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>!  s    *.? @AU VW\ ] r6   zMLCT|RLTD[\w-]{22}r   )r   playlist_title)r*   r   r   r   r;  r<  r   r   r   r  r1  )
r?   r  r#   r  r*  r  r`   r   playlist_urlis_known_unviewables
             r4   _extract_from_playlistz2YoutubeTabBaseInfoExtractor._extract_from_playlist  s	   W%% ?88#*? *?ll<00;G sG]]% %   !l+@+NN 	#LC//8K/??!4!4!6!6! # # # # ##))(KuMM#E $ ; ; 	;r6   c                    |                      |d          pi }t          |d          pi }|                    d          }|                     t          |d                    }t	          ||fddddd	d
 dddf	t
                    }t          |dt                    }|                     |t          j	                  s|dk    s|dk    rdn| 
                    |&|                     |t          j                  p|dk    n	||dk    nd|&|                     |t          j                  p|dk    n||dk    n||nd|                     |t          j                  pd|                     |t          j                  pdd          S )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  privacyry   privacyFormdropdownFormFieldRendererdropdowndropdownRendererr8   c                     |d         d         S )NprivacyDropdownItemRenderer
isSelectedr   r  s     r4   r   zCYoutubeTabBaseInfoExtractor._extract_availability.<locals>.<lambda>A  s    !9:<H r6   rA  iconiconTyper~   )r  r  unlistedPUBLICPRIVACY_PUBLICr   NPRIVATEPRIVACY_PRIVATEUNLISTEDPRIVACY_UNLISTEDF)r   r   r   r   
needs_auth)r  r   r*   r   r   r   boolr   r   r   r   r   r   r   r   )r?   r  sidebar_rendererr  player_header_privacyry   privacy_setting_iconmicroformats_is_unlisteds           r4   r  z1YoutubeTabBaseInfoExtractor._extract_availability1  s     >>tEijjpnp#/6Z#[#[#a_a  8 < <Y G G%%l3CX&N&NOO  )%'787EWYbHHJgioq{}	      $0HX\$^ $^ $^ 
 	(EFF"(H44'+;;; H ## >S=^ OOFI,JKK :,	9FZFf-1BBBlp ?T>_ OOFI,KLL ;,
:G[Gg-1CCC5M5Y11_c#'??69;^#_#_#gcg"oofi6TUU]Y]  $ " "	#r6   c                 x    t          | d t                    pg }|D ]}t          |fd|          }|r|c S d S )Nc                 *    | d         d         d         S )NsidebarplaylistSidebarRendererrN   r   r   s    r4   r   zLYoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer.<locals>.<lambda>]  s    AiL)BCGL r6   c                     |          S r:   r   )r   info_renderers    r4   r   zLYoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer.<locals>.<lambda>_  s    q/? r6   )r   rT  )r  rW  rn   rN  rS   rV   s    `    r4   r  z:YoutubeTabBaseInfoExtractor._extract_sidebar_info_rendererZ  su    "LLdT T ZWY 	$ 	  	 Dt%?%?%?%?OOH   	  	 r6   c           	         t          t          |dd                    }|sdS |                     ||                     ||          |                     ||                    }dd| d}|                     |||dd	|d
          S )zf
        Reload playlists with unavailable videos (e.g. private videos, region blocked, etc.)
        r  r  Nr  zwgYCCAA=VL)r  rt   r	  Fz7Redownloading playlist API JSON with unavailable videos)r  r  r  r  r  r  note)rM  r   r  r  r  r  )r?   r  r  r  is_playlistr  r  s          r4   _reload_with_unavailable_videosz;YoutubeTabBaseInfoExtractor._reload_with_unavailable_videosc  s     <:<`b b c c 	F++d.P.PQVX\.].]33D%@@ , B B !&W
 
 %%WE%U%J & L L 	Lr6   c                 b    d|                      dt                                                    v S )Nwebpageskipr   )r   r   r   )r?   s    r4   skip_webpagez(YoutubeTabBaseInfoExtractor.skip_webpagew  s,    D33F<CVCVCXCX3YYYYr6   c                    d\  }}|                      |          D ]&}	 |                     ||d          }|                     ||pd|          pi }n}# t          $ rp}t	          |j        t                    r4t	          |j        t                    r|j        j        dvr||_	        Y d }~| 
                    ||           Y d }~ nzd }~ww xY w	 |                     |           n/# t          $ r"}| 
                    ||           Y d }~ n4d }~ww xY wt          |ddd	          st          d
          |_	        d }&(||fS )N)NNr  zDownloading webpage)rZ  rl   )i  i  r	  currentVideoEndpointr  z#Incomplete yt initial data received)RetryManager_download_webpageextract_yt_initial_datar   rO   causer	   r   statuserror_error_or_warning_extract_and_report_alertsr   )r?   r#   r  r  r^  r  retryes           r4   _extract_webpagez,YoutubeTabBaseInfoExtractor._extract_webpage{  s   "&&U&33 	 	E	00gDY0ZZ33GW]RW3XX^\^!   ag'9:: !%agy99 !QW^S]=]=]&' &&q&666//5555!   &&q&666  j2HJeff ,-RSS
 }s6   4A
CA	C
-C

CC))
D3DDc                     |sh| j         rcd}d|                     dt                                                    vr|rt	          | dd          |                     |d           d	S d	S d	S )
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,  )r?   r  r  msgs       r4   _report_playlist_authcheckz6YoutubeTabBaseInfoExtractor._report_playlist_authcheck  s     	5. 	5yC$"9"9&I\I\I^I^"9"_"___di_$ \ \ \ "	# # # #
 t44444	5 	5 	5 	5r6   Nwebc                    d }| j         s|                     |||          \  }}|p|                     ||          }|                     |                     |          d          pi }	|dk    r]|	                    d          dk    rDd|                     dg           vr,d}
|rt          |
d	
          |                     |
d	           |s1| 	                    ||           | 
                    |||||          }||fS )Nrb  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 pageTrq  r  )r  default_client)r`  rn  extract_ytcfgr  r  r*   	get_paramr   r,  ru  _extract_tab_endpoint)r?   r#   r  r  r  webpage_fatalr~  r  r^  r  rt  s              r4   _extract_dataz)YoutubeTabBaseInfoExtractor._extract_data  s<     	9 11#wm1TTMGTAT//AAE55d6Q6QRV6W6W_d5eekikLAAA$((99=NNN5T^^M[]=^=^^^k =(t<<<<##C4#888 	o++E+???--c7E_m-nnDU{r6   c                 ~   |                      ||          }|                     |d|id|||dd|	  	        }ddd	}|                                D ]?\  }	t          |fd
t                    }
|
r|                     ||
|	||||d          c S @d}|rt          |d          |                     ||           d S )N)r  r~  r#   r  znavigation/resolve_urlz#Downloading API parameters API JSON)	r  r  r  r  r  r  r  rZ  r~  browser'  )rs   r   c                      | d                  S )Nr  r   )r   ep_keys    r4   r   zCYoutubeTabBaseInfoExtractor._extract_tab_endpoint.<locals>.<lambda>  s    :v9N r6   )r	  rc  r  )r  r  r  r  r  r  r~  r  z0Failed to resolve url (does the playlist exist?)Trq  )r  r  rN   r   rP   r   r,  )r?   r#   r  r  r  r~  r  resolve_response	endpointsr  r  err_noter  s               @r4   r  z1YoutubeTabBaseInfoExtractor._extract_tab_endpoint  s-   ++%+WW11E3<
T[chpu'.Sdr 2 t t (0&II	#//++ 	f 	fJFB-/N/N/N/NPTUUF f--#6b'u^#d . f f f f ff
 F 	: D9999Hg.....r6   c           
   #     K   d|i}|t           u r| j        }|r||d<   d}d| d}t          d |D                       }| j        s|                     ||          ni }|                     |d           d g}	d }
t          j        d	          D ]}|                    |	d
         pi            | 	                    || 
                    |
          |          }|                     | d| d|||||          }
t          |
g|R  }|                     dt          t          |                    i|	          E d {V  |	d
         s d S d S )Nr  r  ))r	  twoColumnSearchResultsRendererprimaryContentsr  r	  )onResponseReceivedCommandsr   r  r  )r	  tabbedSearchResultsRendererr  r   r  r   r  r	  )r  zquery "r  c                     h | ]
}|d          S )r   r   )r<   keyss     r4   	<setcomp>z>YoutubeTabBaseInfoExtractor._search_results.<locals>.<setcomp>  s    AAADQAAAr6   Frb  r   r   )r  r  r~  r  search)r  r  r  r~  r  r  r  r	  )r
   _SEARCH_PARAMStupler`  _download_ytcfgru  r  r  r  r  r  r  r   rz  rT  r   )r?   r  r  r~  r  content_keys
display_idr  r  r|  r  r  r  slr_contentss                 r4   _search_resultsz+YoutubeTabBaseInfoExtractor._search_results  s     Z(F 	$#DN
 (u'''
AALAAABBHLHYa$$^Z@@@_a''U';;;!F!** 
	 
	HKK)!,2333//$*D*DV*L*L]k 0 m mG++%77X77HD-nTYcj , l lF (>>>>L,,j$x?U?U:V:V-WYjkkkkkkkkk$Q' 
	 
	r6   )F)T)NTFrv  )NTrv  )*__name__
__module____qualname__staticmethodrE   rW   r   r   r   r   r   r  r  r   r@  rC  rH  rY  r]  re  rz  r  r  r  r  r  r1  r9  r  rP   r  r\  rC   cached_propertyr`  rn  ru  r  r  r  r
   r  r   r6   r4   r   r   "   s         \4     \ ]
 ]
 ]
~$
 $
 $
L) ) )VQ Q Q*  D D D D 
0 
0 
0!` !` !`F$ $ $L7 7 7
g g g"W "W "WH2 2 2V V V5O 5O 5OnO O Ob @ @ @ \@ Q Q \Q  C C CJn n n>; ; ;.'# '# '#R JN       \ L L L( Z Z Z   :
5 
5 
5 
5   &/ / / /$ N,6u      r6   r   c                   (    e Zd ZdZd                    ej        d                    ej                            Z	dZ
g dddd	d
dddddd	ddedddddd	d
dddddd	ddeddddddddddddddd ged!d"dd#d$d%d&d'd(d)d*d+d&d,d-d)ed.dd/d!d0d1d2d3d4d5g ed6d7d8d9d:d7d;d<d=d>d?d@dAdBdCg dDd5dEdFdGdHdIdJdDdKdLd?dMdNdOdPdQdRdSdRg dTdUdVdOedWdXdYdZd[dOd\dQdRdSg dTdVdOdUdRed]d^dYd_d`dOd\dQdRdSdOdUdRg dTdVedadbdYdcdddOdedQdRdSdUdRdVdOg dTedfdgdYdhdidOdjdQdRdVdOg dTedUdSdRdkdldmdndodpdqddrddd gddedddd!dsddtd!d0dud!d0dvd!d0dwdxdydzd{g ed|d}d~dd:dddddd?dddddg dded5dd:ddddddgdddd!dddddg edddd5dd:ddddddYddddedg ddddd:ddddddgddddddddeg dd5d:ddddddgddddddg edddd:dddddddYdd!d0dddddddddgeeedΜ
dd!id ej                    gdќdd!d0dd!d0di dd֓ddؓdedddeddgdedededdddddLdedddd!dddd:ddeedddd!ded
dd!idgdddddddddgg ded	dd!id!ddd!d0dd!d0dd d!ddd!d0dd!d0dd!d0dd!d0dd!d0ddd!ddd	d!dd
d!d0dd!d0dd!d0dd!d0dddg ddddd!d0ddd!dddd!ddddddddedg d d:d!d d"d#d$dd%gdd&d'd(d)g d*d+ed,dd5d:d+d-d.d%dgdd/d0d0g dd1dd2d3d4d5g ed5dHdd6d7d%gd8d9d:d;d<dHg d6d7ed5d8d9d;d<d7d=d>d?d@dAdBdCdDdEedFdGdHdIdGdJigd>dKd!idLdMddNdNg ddLd!dOdPdQgiidRdSdTdUdVdWdXdYdVg dZed[d\d!dOdPdQgiidRd]d^d_d'd(d)dd*d5d,g d+ed:d+d`d.d!dOdPdQgiidRd%dgdadbdcd!ddddedfdgdhg dHdidjdkdledmdndjdodXdpdndqdrd8g d9dsdtd8d7d;d<d7du
d>dvdwdxdygiiidzgdad{d|d}g ed9d7d8d~dd:d;d<d7dd>dvdwdxdygiiidzgdadddg dd7ddddg ddddddg ddddddg ddddddeddddddddd!dddddddddedddddd!ddddddddddeddddddddd!d0dd!d0dddddddeddddddddddg dddddddg ddddd8dd7dsd8d9g d;d<d7d
d>dAdBddÐdeedŜigdKd!idƜdǐddg dd>dAdBdeedeeeeeeeedʜigd!dːd̜d>d͜dd8dd7dsd8d9g d;d<d7d
d>dAdАdѐdҐdҐdӐdӐdeeedӐdԐdd!d֜igdKd!idאd؜ddd gdedddddddd!dڜdLddېdܐdܐdݐdސdߐdedg dddddddddddddd-dded!ddddddedd5ddddg d:dddddgddddddddedddddd!g dd ddddddddeddd	dd
g ddZe fd            Z ej        de	 d          Zd ZddZd Zd Zej        d             Z xZS (  r   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   r`   r   r   r   r   r   r   r  r   r   )rZ  r#   playlist_mincountr@   z%playlists, multipage, different orderz>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=dd)r   r`   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   r`   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   r`   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 playlistrl   20250417zcole-dlp-test-acczUCiu-3thuViMebBjw_5nWYrAz8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrAr   z"https://www.youtube.com/@coletdjnzz
@coletdjnz)r   r`   r   r  r   r  r   r   r   r   r   r   r   r   )rZ  r#   r@   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_MxArE  z%https://www.youtube.com/@sergeym.6173z@sergeym.6173)r   r`   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   r`   r   r   r   r   r  r   r   r   r   r  rZ  r#   r@   r  z
Videos tabz?https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videoszlex will - Videos)r   r`   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   r`   r   r   r   r   r   r   r  r   r      zPlaylists tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlistszlex will - Playlists)r   r`   r   r   r   r   r   r   r   r  r      z	Posts tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/communityzlex will - Posts)r   r`   r   r   r   r   r  r   r   r   r      zThis Community isn't available)rZ  r#   r@   r  r_  z
Search tabzChttps://www.youtube.com/c/3blue1brown/search?query=linear%20algebra(   z%3Blue1Brown - Search - linear algebra)r   r`   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)r`   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)r`   r   r   r  r  r   r   r   r   r   r   r   r   ic  *[Uu]navailable videos (are|will be) hidden)rZ  r#   r@   r  expected_warningsz!even larger playlist, 8832 videosz/http://www.youtube.com/user/NASAgovVideo/videos)rZ  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)r`   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)r`   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)r`   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)r`   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   extr`   upload_datelicenser   
categoriesr  r   
like_countskip_downloadzThis video is not available.)rZ  r#   r@   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  mp4r`   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#   r@   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  r`   r  r  r   r  r  r  )r#   r@   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.rx  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   r`   r  i,  )r#   r@   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   r`   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   r`   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   r`   r  r   r   r   r  2   )rZ  r#   r@   r   r  zunlisted single video playlistzHhttps://www.youtube.com/playlist?list=PLt5yu3-wZAlQLfIN0MMgp0wVV6MP3bM4_z"PLt5yu3-wZAlQLfIN0MMgp0wVV6MP3bM4_zunlisted playlist)r   r`   r   r  r  r   r   r   r   r   r   r   r   r@   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)r`   r   r"   r   ro   r   r   r   r#   r   r   r   r   extract_flat)rZ  r#   r@   r*  r   r  zHAPI Fallback: Recommended - redirects to home page. Requires visitorDatarecommended
youtubetabr_  r^  )r  extractor_args)rZ  r#   r@   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   r`   r   r   r   r  r   r   i  z!Query for sorting no longer works)rZ  r#   r@   r  r  r_  z;API Fallback: Topic, should redirect to playlist?list=UU...)r   r`   r  r   r   r   r  r   r   r   r   )rZ  r#   r@   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   r`   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   r`   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   r`   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   r`   r   r   r   r   r   r  r   r   r   r   r   )r#   r@   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   r`   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   r`   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   r`   r  r   r   r   r   r   r   r   r      trendingztrending - Nowr}  )r#   r@   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   r`   r   r   r   r   r  r   r   r   z*https://www.youtube.com/shorts/sSM9J5YH_60sSM9J5YH_60zSHORT short)r"   r   r#   r   r`   r   r   )r#   r@   r*  r  z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/livezUCQvWX73GQygcwXOTSf_VDVg - Livez+startswith:https://www.youtube.com/watch?v=)r"   r   r#   r   r`   r   r   r   r   r   r   r   r   r   1)r  playlist_items)r#   r@   r*  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   r`   r   r   r   r   r   r   r   r   r   zchannels tab removed)r#   r@   r*  r  r_  z*https://www.youtube.com/@3blue1brown/about)r   r  r`   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   r`   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   r`   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  r`   d   )r#   r@   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   r`   r   r   r   r   r   r   r   r  )rZ  r#   r   r@   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   r`   r   r   r   r   r   r   r  c                 r    t          j        |          rdn t                                          |          S )NF)r   r   super)clsr#   	__class__s     r4   r   zYoutubeTabIE.suitable1  s/    !*3//JuuUWW5E5Ec5J5JJr6   z(?P<pre>z1)(?(not_channel)|(?P<tab>/[^?#/]+))?(?P<post>.*)$c                     | j                             |                                          }|                    d |                                D                        |S )Nc              3   (   K   | ]\  }}||dfV  d S )Nrl   r   )r<   r  r  s      r4   r>   z-YoutubeTabIE._get_url_mobj.<locals>.<genexpr>9  s*      BB1	QG				BBr6   )_URL_REmatch	groupdictr  rN   )r?   r#   mobjs      r4   _get_url_mobjzYoutubeTabIE._get_url_mobj7  sQ    |!!#&&0022BB

BBBBBBr6   r  c                    |                     d          pd                                }t          |t          |d                    }|r#|                     |          d         dd          pt          |dt
                    }|rdd	i                     ||          |fS |r|                     d
|            ddd                     ||          |fS )Nr`   rl   )r  r|   r}   r#   r  r   ry  r~   TAB_ID_SPONSORSHIPS
membershipz#Falling back to selected tab name: featuredstreams)homelive)r*   r   r   r   r%  r   r  )r?   r  base_urltab_nametab_urltab_ids         r4   _extract_tab_id_and_namez%YoutubeTabIE._extract_tab_id_and_name<  s   GGG$$*1133(LM%O %O P P Et11'::5A!""E K!#cJJJ 	 	,%|c&&!!8, ,  	OM8MMNNN
 
 #h
!
!8, 	,r6   c                 >     t           fd|D                       S )Nc              3   V   K   | ]#}                     |          d          k    V  $dS r   N)r1  )r<   r  r?   r0  s     r4   r>   z(YoutubeTabIE._has_tab.<locals>.<genexpr>S  s;      SSs40055a8FBSSSSSSr6   )r-  )r?   r  r0  s   ` `r4   _has_tabzYoutubeTabIE._has_tabR  s*    SSSSSdSSSSSSr6   c                 H     | j         g |fi |                     ||          S r:   )r  r  )r?   r  r  s      r4   _empty_playlistzYoutubeTabIE._empty_playlistU  s1    #t#Bcc43S3ST[]a3b3bcccr6   c                                           |          }t          j                            t          j                            |                              d                    }                     dg           }                     |          }|d         |d         |d         |d          f\  }}}}	|	r|                    d          r|d d	         d
k    r/ 	                    d|d	d           t          |d	d                    S |d d	         dk    r_                     d| |d          }
t          |
ddt                    }|st          d           	                    |t                    S |d         dk    r# 	                    d| | | t          |          S |dd          | | }}|	r|sd|vr| d| }|                    d          r                     d|            t!          |          fddD             \  }}|se|d                             d          rJ|st          dd                               d |             	                    d!| t          |          S                      ||          s 	                    d"| t&          |          S                      ||          \  }}t          |d#d$          }|r]d|vrYd%                    t-          d&|          ||f          }                     d'|             	                    |t                    S                      |          g }}|	r|rd|vr                     |          }                     ||          \  }}                     d(|d)| d*|           |d+k    r                     ||          S |sK|rH                     d,                                |d-          r+|                    d%                    |d.|f                                          |d/          r+|                    d%                    |d0|f                     |s|d1k    r|d d	         d2k    r                     ||          S d3|d	d           }d!| }	                      |||dd4          \  }}||}}                     d5| d6           nr# t          $ r                      ||          cY S w xY w|r|d1k    r| | d }}n;|pd1|k    r3|d7k    rt?          |8          |rt          d9| d:d          | | }d;|vr                      |||          p|} !                    |d<                                |          g }}|rY "                    ||||          g}|d=         #                    t          $                                t          j%        |d>                                d?          d@k    r"|&                     fdA|D                        n(|&                    tO           j(        |                     tS          |          dk    r|d=         S |rc *                    ||          }dB}tW          |dC           rdD|dE         d	d           }                     dF|              j,        ||fi |S t          |dGtZ          H          }|r .                    |||||          S t          |dIt          H          p|}|r=|dJk    r                     dK|             	                    d"| t&          |          S t          dL          )MNr&   r(   r|  prer  rK  not_channelr%   r  rY  r   MPz"https://music.youtube.com/channel/	web_music)r~  )r  r  urlCanonicalFrx   z#Failed to resolve album to playlistchannel_typer  r   r{  z/videosz8YouTube Music is not directly supported. Redirecting to c              3   <   K   | ]}t          |d f          V  dS r4  )r   )r<   rU   qss     r4   r>   z-YoutubeTabIE._real_extract.<locals>.<genexpr>y  s1       U Ub3(!;!; U U U U U Ur6   )r  rT  watchz&A video URL was given without video IDTrq  zDA video URL was given without video ID. Trying to download playlist r   r   )r  .navigateActionr  r|   r}   r#   r   rl   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 URLr*  z/streamsshortsz/shortsr.  UCUU)r  r  r  zQThe channel does not have a videos, shorts, or live tab. Redirecting to playlist z insteadr,  )r   zThis channel does not have a z tabzno-youtube-unavailable-videosr  r   )extractor_key	extractorwebpage_urlr  0c              3   N   K   | ]}                     |t                    V   d S r:   )r   r   )r<   ur?   s     r4   r>   z-YoutubeTabIE._real_extract.<locals>.<genexpr>  s1      PP4??1l;;PPPPPPr6   zthe Uploads (UU) playlist URLc                 8    | d                              d          S )Nr   rE  )rQ   r   s    r4   r   z,YoutubeTabIE._real_extract.<locals>.<lambda>  s    1\?+E+Ed+K+K r6   z(https://www.youtube.com/playlist?list=UUr   zeDownloading as multiple playlists, separated by tabs. To download as a single playlist instead, pass )r	  r)  r*  r*  r~   )rc  r   rY   z/livez5Unable to recognize playlist. Downloading just video zUnable to recognize tab page)/r   r+   r,   r/   r-   r0   r  r%  r*   r   r   r  r   r   r   r,  r   rQ   _yes_playlistr   r  joinr   	to_screenr  r  r1  r  r7  r5  r  r   r\  rk  r  r  r   IE_NAMEextendmap_real_extractr,  r  r   r  rP   r9  )r?   r#   r2   r  r|  r$  r9  r  rK  
is_channelmdatamurloriginal_tab_idr  r   r   r  r  redirect_urlr  
extra_tabsr  selected_tab_idselected_tab_namepl_idpl_urlr8   r  uploads_urlr*  r@  s   `                             @r4   rT  zYoutubeTabIE._real_extractX  s	   ..%%l%%L!!#&&//7H/IIK Knn]B77!!#&&%)%[$u+tF|QUVcQdMd%d"S$
 	f-++N;; 	frr{d""Lwqrr{LLl\cdedfdf\gi i i!$$22BBBG\g 3 i i#E+e,1F F F P()NOOOt\:::n%11MM#MtMM|]df f f '*!""g'/@3/@/@ 	(c 	(&C;&V&V''''C^,, 	b `[^ ` `aaa c]] U U U U} U U U+ 	cD/::7CC 	c ^$%MX\]]]] tgr t tuuu??FFFVac c c !!+x88 	T??=8==y(T T T ((j99e
 $  C  MRS S S 	?9LL77G,E|$T$TVY[_#`aaLNN  E  wC  E  E  F  F  F??<>>>66t<<bj 1	%$ 1	%#@#S#S55d;;L151N1N|]`1a1a.O.{o{{CT{{hw{{||| '))++GT:::" (%'8 (%  d e e e==y11 H%%bggsJ.E&F&FGGG==x00 G%%bggsIt.D&E&EFFF " 5o&A&Arr{d**#33GTBBB /..EMeMMFA&*&8&8e[_os&8&t&te (-fpuA A A A	 * C C C#33GTBBBBBC   5Ox$?$?#&C!-X/AA"f,, &w7777& o()^)^)^)^imnnnn ndnn ++==77
D%PPXTXD'''===33D992g 	..wtTJJKGAJ!-!4!4!6!6)1"    
 >>*++s22NNPPPPZPPPPPPPNN3t1:>>???w<<11: 	F77FFH9Kx!K!KLL feR^I_`a`b`bIceeNNPBMP PQ Q Q (4'EEHEEE  Scgi i i 	T..wT8USSSFVY[ [ [ g^f 	 	gg~~##$f\d$f$fggg??#Ph#P#PR[]efff;<<<s   S  S=<S=)r  )r  r  r  IE_DESCformatr   _RESERVED_NAMESrO  _INVIDIOUS_SITES
_VALID_URLrQ  intrT  r   r   r   rM  _TESTSclassmethodr   r;  compiler!  r%  r1  r5  r7  r   rE   rT  __classcell__r  s   @r4   r   r     st       G	  
/?((3DEE 
 
 
! ( Gj&^,0 Z'-F&4U&)
 
	  j$ 8O,0 Z'-F4&U&)
 
	 #jH $[,.AU$4)B%"O&)#'
 
 Ejl (H,3A*G.4U)&)
 
	 kjN E MjV /Y6,'*4U$+@'
 
 ' Sj| !Y60"'4U&C*#
 
 # {j` R,&A"(!444AU4&)
 
 ! _jB P,(A"(444U4A!&)
 
 !! Ajd 0h,(A"(4A!444U&)
 
 !! cjF  S,+A"(A!U4444&)
 
  ! Ejh S,'A!U4444&)A("
 
  1# gjN T,<AU"O$4&)B)%#'
 
 Kjr E qjx N wj~ L }jF mY.6A'4U&$+'D
 
 ' Cjl !O-,U("4$)#B
 
 "KL' kjT 4@ Sj\ hO6,4U+($/,H
 
  % [jD	 AY.6'AU4($F-(
 
 !KL) A	jl	 =O+, U4($%!>
 
 "KL' k	jV
 FY76A4U&$'+'D
 
  ' S
j|
 U {
jB GeM%1A+,
 
 T
 /#9#%%&' Ajj _ ijp G ojv O
-
5
 S
 ;	

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

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

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

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

   Yjt O,6
 

  
 
ojF S,=
 

 	 	CjX O,6
 

 	 	Ujl J,0&)4UA2A3(#'
 
 % gjR >,.UA&)4'C(*#'
 
  % Mjv R,*4U%&)AF-&
 
  ! sjZ J	 Ujd .	 _jn 5,,4%A&)UK&2
 
  # ijP 7%
 

  e
 
Mjd k
 

  	 	ajv Q,1*-4U@'+
 
 #C#&!"	 	
  "4(7 sjn O,6
 
 #D(!"), #"'+ 
 $ $(3??7 kjh S,3*-4U@'+
 
 &Q08$&Y"*-"%' D+'+ 
 & "4(&I% %cjp < "O"&)4$UAB)%#'
 
 # mjT M,4PA/'&)U&7
 
 ! Qjx <,"?+&#47U&)#'
 
  % sj` P,U)B4%&$(0
 
 !KL+ YjH  )I,#4!&)A(A$U#'' ' '
 
 E jt  x; ,"4'&)A'@#U
 
 q jFX! K K K K [K bjbZbbbccG  
, , , ,,T T Td d d !:Y= Y= ;:Y= Y= Y= Y= Y=r6   r   c                   J    e Zd ZdZd                    ej        d                    ej                            Z	dZ
ddddd	d
dedddd	g ddddddddddddddddddd d!d"g d#edd$d%dd&g d'd(d)d*d+d,d-d.d/d-ed0g d1d2ddd3d4gd5d6d7d8d9d7d8gZe fd:            Zd; Z xZS )<r   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   )r`   r   r   r   r   r   r   r  r   r   r  r   r      r  "PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlYDL_safe_search)r`   r   r  zThis playlist is private)r#   r@   r   r_  embeddedzQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEur  JODA15"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEumilanz
@milan5503rl   z8https://www.youtube.com/channel/UCEI1-PVPcYXjB73Hfelbmaw20140919zUCEI1-PVPcYXjB73Hfelbmawz"https://www.youtube.com/@milan5503)r`   r   r   r   r   r   r  r  r   r   r   r   r   )z.[Uu]navailable videos? (is|are|will be) hiddenRetryingz	Giving up)rZ  r#   r   r@   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)r`   r   r   r   r   r   r   r   r  r   r   r  r   r  )r#   r  r@   r  TLGGrESM50VT6acwMjAyMjAxNwTr  )OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMc                     t                               |          rdS ddlm}  ||          }|                    dd g          d         rdS t                                          |          S )NFr   )r   r  )r   r   yt_dlp.utilsr   r*   r  )r  r#   r   r@  r  s       r4   r   zYoutubePlaylistIE.suitableV	  sw      %% 	5))))))Xc]]66#vq! 	5ww$$$r6   c                    |                      |          }t          j        |          }t          dt	          |          pd|i          }|rt          |ddi          }|                     |t                                          |          S )Nz https://www.youtube.com/playlistrT  r%   Tr   )	r   r   r%   r   r   r   r   r   r   )r?   r#   r   r%   s       r4   rT  zYoutubePlaylistIE._real_extract`	  s    nnS))/<SAA.SMM2fk24 4  	;cND#9::Cs|':':'<'<{SSSr6   )r  r  r  r`  ra  r   _PLAYLIST_ID_RErO  rc  rd  rQ  re  rf  rg  r   rT  ri  rj  s   @r4   r   r     s       !G !&,<((3DEE !    !G #5&&)AB(4%U$
 
  ' * 4&6
 
 *  b6'U'4@$
 
 jii) . b >6(AUA4($
 
 LL' * , 
 ; QLF\ % % % % [%T T T T T T Tr6   r   )&rC   r  r;  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   r6   r4   <module>r     s
           				      6 6 6 6 6 6 6 6       B B B B B B B B                                           0H H H H H": H H HVE= E= E= E= E=. E= E= E=R(rT rT rT rT rT0 rT rT rT rT rTr6   