
    }j                        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%y)    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                   >   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 jB                  d        Z"d%dZ#d%dZ$d&d!Z%d'd"Z&dZ'e(d fd#Z)y)(YoutubeTabBaseInfoExtractorc                 L     d t        j                          fd       }|S )Nc                 `   | j                  d      dvr| S |j                  d      rst        j                  j                  | d         }|j                  dv rC|j                  d       t        j                  j                  |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      P/root/.hermes/venv/lib/python3.12/site-packages/yt_dlp/extractor/youtube/_tab.py_smugglezGYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>._smuggle%   s    xx (BB  0#\\224;?
$$(PP!%%n5"(,,"9"9*:M:MUh:M:i"jDK)$u+}EUK    c                     t        |i       \  }| j                  |      rdd<    | |      }r, |       |j                  d      rfd|d   D        |d<   |S )NTr%   entriesc              3   L   K   | ]  } |j                                 y wN)copy).0ir5   r2   s     r4   	<genexpr>zYYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper.<locals>.<genexpr>:   s"     +lRSHQ8J8J8L,M+l   !$)r   r%   r*   )selfr#   	info_dictr2   r5   funcs      @r4   wrapperzFYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper1   so    !.sB!7C  %04n-T36IM2==++lW`ajWk+lIi(r6   )	functoolswraps)rB   rC   r5   s   ` @r4   passthrough_smuggled_dataz5YoutubeTabBaseInfoExtractor.passthrough_smuggled_data#   s,    
	 
			 
		 r6   c                     d}| j                         D ]E  \  }}t        |t              s||v r|c S |j                  d      s1|j	                  d      sC|c S  y )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	 r6   c                    |j                  d      }t        |d      }| j                  |dd      xs | j                  |d      }| j                  |dd      }t        |j                  d            }|t	        | j                  |d	d
            }|0t	        | j                  dt        |ddt              |d d            }t        |dt        d      }|st        |d      }| j                  |      }t        |ddt              }| j                  t        |d            }	| j                  t        |d            }
t        dt        |dt                    xs d}d| }|dk(  sd|v rd| }| j                  |d d!      xs | j                  |d"      xs d}t        t        |d#d$            }|d%n<d&|j                         v rd'n(|d(k(  s | j                  |	t        j                        rd)nd }| j                  |d*d+d!      xs d}d,|j                         v rd-n| j                  d.|i      }|d/v rd0nd1}| j                  |d2d3      xs | j                  |d4      }t        |d5| j                   d      }i d6d7d8t#        j$                         d9|d7|d|d:|d|d;|d<|d=|rd>| nd d?|d@|dAt'        |d dBd C      dD| j)                  |dE      dF| j+                  dGt,        H      r| j/                  |      nd dI|dJ| j                  |	t        j0                        rdKn| j3                  | j                  |	t        j4                        xs d | j                  |	t        j6                        xs d | j                  |	t        j8                        xs d | j                  |	t        j:                        xs d L      ||dM|dN| j                  |
t        j<                        rdOiS d iS )PNvideoId)navigationEndpointreelWatchEndpointoverlayreelPlayerOverlayRenderer"reelPlayerHeaderSupportedRenderersreelPlayerHeaderRenderertitleheadlinereelTitleTextdescriptionSnippet)detailedMetadataSnippets.snippetTextlengthSeconds
lengthText)thumbnailOverlays."thumbnailOverlayTimeStatusRenderertextz](?i)(ago)(?!.*\1)\s+(?P<duration>[a-z0-9 ,]+?)(?:\s+[\d,]+\s+views)?(?:\s+-\s+play\s+short)?$)ra   accessibilityaccessibilityDatalabel )defaultexpected_typeduration)rp   group)shortBylineTextruns.r[   browseEndpointbrowseIdF)rq   get_all)channelNavigationEndpointrv   rw   )ri   .rj   stylerx   rq   badgesownerBadgeshttps://www.youtube.com/)r[   commandMetadatawebCommandMetadatar#   rq    https://www.youtube.com/watch?v=SHORTSz/shorts/https://www.youtube.com/shorts/publishedTimeText	videoInfotimestampText)upcomingEventData	startTimerx   is_upcomingstreamedwas_liveLIVEis_liveviewCountTextshortViewCountTextzno viewsr   
simpleText)r   r   concurrent_view_count
view_count	ownerTextrt   channelTitleText)rt   ru   .r[   )r   r   r#   )rv   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rp   
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@   rW   video_idreel_header_rendererra   r   rr   r   overlay_styler|   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 x*=vPdfuAvnnX/CEuvx||O<=%dnn,(p'r sH%d&8&8pX'_ik{~$j '9 ': ;H
 "ju.
 %&:<wxJ&&z2
$_. %%l8X&FG++L=,QR !;\\>   &#% 	 1
;H$
n(D3H:>C^^H.A;O T';_MTQS 	(h@blq)rs 1<M)Y__->>+v5QZQcQc9d	 	 ..?DXZefljl%)>)>)@@a??L/+JK 	6AE_6_2eq>>(K9JK Onn%9;MN 	 &h 1h ..?
U
i&&(
 (
 3	

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

 u
 
 *
 ;
 U
 >
 L?[eij
 %l/1AQUQ`Q`'b
  $228[I!
"  ??8-BCO *:;UY)
* 4>>(4HI+
, "4??$$\(M%JKYM_M_,a4-
 	
. gk/
 	
r6   c           	   #   "  K   |d   D ]  }t        |t              st        |dt        hf      x}r| j                  |      x}r| B| j	                  |      }t        |t              sd| j                  |d      }|j                  d      }|r-| j                  d| t        j                         ||       |j                  d      }|r| j                  |       |j                  d      }	|	r| j                  |       t        d	t        |d
 t                    }
|
s%t        t        t         fD ]J  }|j#                  |
      s| j                  |
|j                         |j%                  |
      |          y w)NrO   lockupViewModelra   
playlistId&https://www.youtube.com/playlist?list=ier   video_titlerZ   r   r~   c                     | d   d   d   d   S )Nr[   r   r   r#    xs    r4   <lambda>z;YoutubeTabBaseInfoExtractor._grid_entries.<locals>.<lambda>   s    A&:$;<M$NOc$dej$k r6   )rP   rQ   r   _extract_lockup_view_modelrX   r   r*   
url_resultr   r   r   r   r   r   r   YoutubePlaylistIEr   suitable	_match_id)r@   grid_rendererrT   lockup_view_modelentryrW   ra   playlist_idr   r   ep_urlr   s               r4   _grid_entriesz)YoutubeTabBaseInfoExtractor._grid_entries   s    !'* (	DdD)$08ID67R$SS S ;;<MNN5NK88>Hh-NN8W5E #,,|4Koo<[MJ#**,{ % & ' ' ||I.H))(33!k2J44X>>7k: F '):IF B{{6*"oo"ryy{R\\&=Q_d . f f	I(	s   D)F-%F<Fc                    t        |d      }|r6t        |d      }| j                  d| t        j                         ||      S t        |d      }|rct        |d      }|r,| j                  d| d| t        j                         |      S | j                  d	| t        j                         |      S t        |d
      }|r)| j                  d| t        j                         |      S y )N)playlistItemDatarZ   )flexColumnsr   )musicResponsiveListItemFlexColumnRendererrk   ru   r   rk   z"https://music.youtube.com/watch?v=)r   r   ra   )r[   watchEndpointr   )r[   r   rZ   z&list=r   r   (https://music.youtube.com/playlist?list=)r[   rv   rw   !https://music.youtube.com/browse/)r   r   r   r   r   )r@   rW   r   ra   r   	browse_ids         r4   _music_reponsive_list_entryz7YoutubeTabBaseInfoExtractor._music_reponsive_list_entry   s&   *IJ  ,+ ,E ??%Gz#R&/&6&6&88SX # Z Z"8-bc#H.`aH)KH:U[\g[h'i*6*=*=*?+ ' W W??%Mk]#[&2&9&9&;k # S S +_`	??%Fyk#R&2&9&9&;i # Q Q r6   c              #      K   |j                  d      }t        |t              sy |j                  d      xs |j                  d      }|r| j                  |      E d {    |j                  d      }|ry y 7 w)NcontentgridRendererexpandedShelfContentsRendererhorizontalListRenderer)r*   rP   rQ   r   )r@   shelf_rendererr   rW   s       r4   _shelf_entries_from_contentz7YoutubeTabBaseInfoExtractor._shelf_entries_from_content  sx      $$Y/'4(;;~.^'++>]2^ ))(333;;78  4s   AA;A9 A;c              #      K   t        |d t              }t        d|      }|r.|rd|v ry | j                  |d      }| j	                  ||       | j                  |      E d {    y 7 w)Nc                     | 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?ra   )r   )r   r   r   r   r   r  )r@   r  skip_channelsep	shelf_urlra   s         r4   _shelf_entriesz*YoutubeTabBaseInfoExtractor._shelf_entries   sq     c 5r:	 !:NN>7;E//)/??33NCCCs   A#A-%A+&A-c              #      K   |d   D ]o  }t        |t              s|j                  d      xs |j                  d      }t        |t              sI|j                  d      }|s]| j                  |       q y w)NcontentsplaylistVideoRendererplaylistPanelVideoRendererrZ   )rP   rQ   r*   r   )r@   video_list_rendererr   rW   r   s        r4   _playlist_entriesz-YoutubeTabBaseInfoExtractor._playlist_entries0  sw     *:6 		0Ggt,{{#:;hw{{Kg?hHh-||I.H%%h//		0s   A9A;c                 ^   |j                  d      }|sy |j                  d      }|dk(  rt        }d| }d}n4|dv rt        }d| }d}n"| j                  d	| d
t	                d       y t        |ddt        hf      }t        |ddt        hf      }t        |dddddddt        hf      }	t        |	ddt        j                  ht        f      }
t        |	ddt        hf      }dt        hfdddddd| j                  hfdt        hfdddddd| j                  hfd }t        |d!dd"d# dt        |f      }t        |d$d%d&d'ddd(d)d*d+d,d-d.dd/d0t        hf      }|st        |d|f      }t        |d!d1 d"df      }t        |d2ddt        j                  hf      }t        |d!dd3dd4dt        hf      } | j                  |||ft        |d0dt        hf      | j                  |dg|dd$d56      t        |
      t        |      d7k(  rt        |dddt         hf      nd | j#                  d8t        9      r| j%                  |d:;      nd |
d<k(  rd=nd>|v rd?n	|rd@|v rdAnd | j'                  dB|v C      t)        |dDdEd F      t)        |dGdHd F      t        |ddt        ht*        t,        f      dI
|S )JN	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lockupMetadataViewModelcontentMetadataViewModelcontentImagethumbnailViewModeloverlays.))thumbnailBottomOverlayViewModelr|   )thumbnailOverlayBadgeViewModelthumbnailBadgesthumbnailBadgeViewModelrk   
badgeStyler   commandRunsr   onTapinnertubeCommandrv   rw   r   )r   r   r   r   metadataRowsmetadataPartsc                 0    |d   d   d   d   d   d   d   S )Nrk   r(  r   r)  r*  rv   rw   r   _vs     r4   r   zHYoutubeTabBaseInfoExtractor._extract_lockup_view_model.<locals>.<lambda>d  s+    6=1!4W=>PQRbcdno r6   imageavatarStackViewModelrendererContextcommandContextshowDialogCommandpanelLoadingStrategyinlineContentdialogViewModelcustomContentlistViewModel	listItemslistItemViewModelra   c                     d|d   d   v S )NaccessibilityLabelr,  r   r.  s     r4   r   zHYoutubeTabBaseInfoExtractor._extract_lockup_view_model.<locals>.<lambda>p  s    )=?ASTVAW)W r6   r?  r|   badgeViewModelsources	final_key   r   r   F)report_failureupcomingr   "THUMBNAIL_OVERLAY_BADGE_STYLE_LIVEr   r   r   BADGE_MEMBERS_ONLY)r   r   r   r   r   r   )
ra   r   rr   r   r   r   r   r   r   creators)r*   r   r   report_warningr   r   rQ   r   r   anyr   r   r   r   r   lenr   r   r   r   r   allfilter)r@   
view_model
content_idcontent_typer   r#   
thumb_keyslockup_mdvmcontent_mdvmthumbnail_badge_view_modelsduration_textthumbnail_badge_styleschannel_traversal_dictchannel_infocollaborator_dataviews_and_timerelative_time_textbadge_styless                     r4   r   z6YoutubeTabBaseInfoExtractor._extract_lockup_view_model<  s   ^^K0
!~~m466B4ZLAC J\\B::,GCMJ>|nANaNcMde     ":
<UX\W]/^_#K*>X[_Z`1ab&2:0*c D -v	@7 '8#
 %%@3QTQZQZP[]`Bab!-.ICQ]`c_dKe!f "C5)(!W6HJZ\fimizizh{|"SE*)1g7IK[]orv  sG  sG  rH  I	"
 $LCoC/31 2 )+->@PRY[m!7J[]l[#/BGdV7U V '(9A?U;VWL%lWS5" # *.2vySVS\S\R]:^_#LC30@,QTPU3W X tZ{Wi#,GH//
=L!+=L-A=LCJ=LW` 0 b#M2 ~&!+ ^a[M-RS15 **+=l*S %%&8%OY]!.*!<"FJ`"`Y#5*HZ:ZZ++?SWc?c+d$\<Aeost%lMC_imn!"3c9seSRX5YZ-. / 	r6   c              #     K   t        |ddt        hf      x}r| j                  |      x}r| y t        |ddt        f      xs i }|j	                  d      }|r| j                  |       y |j	                  d      }|r=| j                  d| t        j                         || j                  |d             y |j	                  d	      }|r{t        |d
dddt        hf      }|sy  | 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| j                  |dd      i y y w)Nr   r   )rI   rL   rH   shortsLockupViewModelrZ   r   r   ra   r   entityIdr)  r*  r\   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 r6   r   secondaryText)ra   r   r   )r!  r!  r1  rA  rB  )r   rQ   r   rK  r*   r   r   r   r   r   r   r   r   r   )r@   rich_grid_rendererr   r   rW   r   r   	entity_ids           r4   _rich_entriesz)YoutubeTabBaseInfoExtractor._rich_entries  s     ,-?)M^ae`fAg hhh778IJJuJjlopr xuw 	 <<	*%%h//ll<0//8F&&(; NN8W= " ? ? LL,	#Hw8JL_ajmplq.rsH!$//1(<
kx
k x*M9seL,  0H  /I  KL  MN PST $5oyS^R_"`	* 
k  33S_h 4 j
k 
k  s   EEc                 L    |j                  d      }|r| j                  |      S y )NrZ   )r*   r   )r@   video_rendererr   s      r4   _video_entryz(YoutubeTabBaseInfoExtractor._video_entry  s+    !%%i0&&~66 r6   c                     t        dt        |d            }|r6| j                  |t        j	                         | j                  |d            S y )Nzhttps://youtube.com)onTapCommandr   r   r#   hashtag)r   ra   )r   r   r   r   r   r   )r@   hashtag_tile_rendererr#   s      r4   _hashtag_tile_entryz/YoutubeTabBaseInfoExtractor._hashtag_tile_entry  s[    +\!#c.e f??++-T^^DY[d5e # g g r6   c              #   l  K   t        |d t              }|sy t        |d t              xs i }|j                  d      }|r| j                  |      }|r| t        |d t              }|r+| j                  d| t        j                         |       t        |d t              xs g }|D ]  }t        |t              st        |d t              }	|	s)t        j                  |	      s?t        j                  |	      }
||
k(  rZ| j                  |	t        j                         |
        y w)	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backstageAttachmentrI   r   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    Q'<%=o%N r6   rZ   c                     | d   d   d   S )Nrx  rH   r   r   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    Q'<%=>P%QR^%_ r6   r   r   c                     | d   d   S )NcontentTextru   r   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    -0@0H r6   c                     | d   d   d   S )Nr[   urlEndpointr#   r   r   s    r4   r   zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    q!56}EeL r6   )r   rQ   r*   r   r   r   r   r   listrP   r   r   r   )r@   post_thread_rendererpost_rendererrl  r   r   r   ru   runr   ep_video_ids              r4   _post_thread_entriesz0YoutubeTabBaseInfoExtractor._post_thread_entries  sJ     "NPTV NPTV \Y[ 	!%%i0''7E_adf//8F&&(; " @ @ }&H$OUSU 	WCc4(LcSF%%f-#--f5K;&//&Y-=-=-?+/VV	Ws   D2D4c              #   B  K   |j                  d      }t        |t              sy |D ]r  }|j                  d      }t        |t              r| j	                  |      E d {    >|j                  d      }t        |t              s`| j                  |       t y 7 =w)Nr  backstagePostThreadRendererrI   )r*   rP   r~  rQ   r  rm  )r@   post_thread_continuationr  r   rW   s        r4   !_post_thread_continuation_entriesz=YoutubeTabBaseInfoExtractor._post_thread_continuation_entries  s     +//
;(D) 	2G{{#@AH(D)44X>>>{{?3H(D)''11	2 ?s   ABB &BBc              #   r   K   t        |d      D ]$  }| j                  t        d|      t               & y w)N)rows.reportHistoryTableRowRenderercells.reportHistoryTableCellRenderercell"reportHistoryTableTextCellRendererrk   ru   .r[   r   r   r#   r  )r   r   r   r   )r@   rW   r#   s      r4   _report_history_entriesz3YoutubeTabBaseInfoExtractor._report_history_entries  s@      +V W 	VC //'*CS"I9UU		Vs   57c              #      K   d gd d  t        |d t              xs g }|D ]  }t        |t              st	        |dddt              }|s|j                  d      r2 j                  |d         D ]  }|   j                  |      d<   nJ|j                  d      r9t	        |d	      } j                  |      E d {     j                  |      d<   t        |d
 t              xs 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}
|	j                         D ]6  \  }}||
vr |
|   |      D ]	  }|s|   j                  |      d<      d   r j                  |      d<    d   s j                  |      d<   y y 7 !w)Nc                     | d   S Nr  r   r   s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s
    a
m r6   itemSectionRenderermusicShelfRenderermusicShelfContinuationr   richItemRendererr   reportHistorySectionRenderer)r  tabletableRendererc                     | d   S r  r   r   s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s
    !J- r6   c                 (    j                  |       gS r:   )r   r   r@   s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>#  s    $BbBbcdBeAf r6   c                 (    j                  |       gS r:   )rm  r  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>%  s    0A0A!0D/E r6   c                 0    j                  dd| igi      S )NrO   rH   r   r  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>&  s!    $2D2DgQcefPgOhEi2j r6   c                 0    j                  dd| igi      S )NrO   rJ   r  r  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>'  s!    1C1CWPacdOeNfDg1h r6   c                 (    j                  |       gS r:   )rr  r  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>(  s    d6N6Nq6Q5R r6   c                 (    j                  |       S r:   _extract_entriesr   continuation_listr@   s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>)  s    $2G2GK\2] r6   c                 (    j                  |       gS r:   )r   r  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>*  s    $2Q2QRS2T1U r6   )playlistVideoListRendererr   reelShelfRenderershelfRenderermusicResponsiveListItemRendererr  rI   rH   rJ   hashtagTileRendererrichGridRendererr   )r   r~  rP   rQ   r   r*   rj  _extract_continuationr  r  r   r  r  rO   )r@   parent_rendererr  r  r   is_rendererr   r  isr_contentsisr_contentknown_renderersrV   rW   s   ` `          r4   r  z,YoutubeTabBaseInfoExtractor._extract_entries  s$     $v!?,CTJPb .	OGgt,&.0DF^"$K ;;12!%!3!3G<N4O!P $#$+/+E+Eo+V%a([[!?@(2lmE#;;EBBB+/+E+Ee+L%a(";0GNTRTL+ !+t4 261G1G$($6$6)-););%)%8%87f373L3L%E(j'h+R(]'U# &1%6%6%8 MC/1 !5!5h!? ( "'K( ,0+E+Eh+O%a(%6 %Q''+'A'A+'N!!$].	O` !##'#=#=o#Na  $G Cs   B>G&G#CG&$G&13G&c              #      K   d g fd}t        |d t              }|sy t        |d t              xs t        |d t              xs i } ||      E d {    d   }	t               }
t        j                  d      D ]  }|	s y |	j                  d      }|||
v r j                  d        y |
j                  |        j                  |||	      } j                  | d
| |	||ddddddddd ff      }|s y d }	 j                  |      xs |} 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 ]B  }||vr||   \  }}|r||in|}d g ||      E d {    d   xs  j!                  |      }	D |	xs  j!                  d|gi      }	|	r|r y  y 7 7 Ew)Nc                 (    j                  |       S r:   r  r  s    r4   r   z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>=  s    D$9$9!=N$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>B  s    1-B+C r6   c                     | d   S )Nr  r   r   s    r4   r   z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>C  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(  xr |dk(  S )NrV    GetRecommendedMusicPlaylists_ridr   )kr0  s     r4   r   z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>W  s%    bcglbl  cYqr  wY  rY r6   )item_idqueryheadersr  check_get_keysrO   r  r  )rI   gridPlaylistRenderergridVideoRenderergridChannelRendererr  r  r  r  r  playlistVideoListContinuationgridContinuationitemSectionContinuationsectionListContinuationr   ))r  r  .appendContinuationItemsActioncontinuationItemsFr   )rq   rp   )r   rQ   set	itertoolscountr*   write_debugaddgenerate_api_headers_extract_response_extract_visitor_datar   r  r  r  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_rendererrV   rB   
parent_keyr  s   `                     @r4   _entriesz$YoutubeTabBaseInfoExtractor._entries;  s
    !FOc#94@K!CTJ Q{$CTJQNP 	 #?333(+ U!* C	H!-!1!1.!A!-2DHZ2Z  !XY""#56//2FUa 0 cG--")6(4"G5*,GIf&(?hPS  VY  Z  . H L  55h?O<L #'"4"4g!>)-););W(E&*&8&8'%B(,(:(:G'D*.*@*@*)M(7'D%4j$A040V0VXb/c262N2NPV1W262H2H$1O%)%7%7$>,0,R,RTX+Y,;T+B$($6$6#@O" ".h 9 &u"6 !--?DX\fh i#' ( ho-#23#7 jKU
4F'G[m$%)F! 455503gt7Q7QRf7gh (h4+E+EzTeSfFg+hL(<GC	 	4x 6s1   AI	IF(I	I8I	<I	 I	I	c                 V    | D ]  }|j                  d      s|c S  |rt        d      y )NselectedzUnable to find selected tab)r*   r   )tabsfataltab_renderers      r4   _extract_selected_tabz1YoutubeTabBaseInfoExtractor._extract_selected_tab  s;      	$L
+##	$  !>?? r6   c                 &    t        | dt              S )N)r  twoColumnBrowseResultsRendererr  .)tabRendererexpandableTabRendererr   )r   rQ   )r  s    r4   _extract_tab_renderersz2YoutubeTabBaseInfoExtractor._extract_tab_renderers  s    {  LPQ 	Qr6   c                 :   | j                  ||      }| j                  |      }|dxx   t        |dd      z  cc<   |dxx   t        |dd      z  cc<    | j                  | j	                  ||d   || j                  ||      | j                  ||            fi |S )Nra   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_tabs  s    33GTB11$7\,II\,PP#t##MMhtne225$?**479
  	r6   c                 	   d|i}t        |dt              }|rXt        |d| j                  hfd| j                  hf      }|j	                  |j                  d      |d       |d   r|d   |d<   nt        |d	t              }t        |d
dddt        hf      d }| j                  |d      }|r% ||d   d         }|r|j                  |ddd       | j                  |d      xs | j                  dd      }	|	D ]  }
d|
d<   	 |	r% ||	d   d         }|r|	j                  |ddd       | j                  |d      }t        |dt              }| j                  |d      }| j                  |d       }|j	                  t        |d      xs | j                  |d!      xs |d   | j                  |      | j                  |d"      xs  t        d#d$d%d&d'd( d)dt        ht        f
      t        |d*       t        |d+d,d-d&t        hf      xs t        |d.d/ hd&f      |xs ||z   |	z   d0       t        |d1| j                   hfd23      xs t        |d
d&d4| j"                  hfd23      }|r!|j	                  |t%        |d d5d 6      d7       | j'                  t        |d8d23            }| j)                  |t*        j,                        st        fd9d:D              rd;|d<<   t/        ||fd=      }| j1                  | j                  |d>      xs | j                  |d?            }t3        |      |d@<   | j                  |d      |dA<   |dA   | j                  |dB      |dA<   |dA   | j                  |dC      |dA<   | j                  |d      |dD<   |dD   | j                  |dE      |dD<   |j                  d      st        |dF      }|st        | j                  |dG      dH      }| j                  |      }t        |dI      xs i }|j	                  | j5                  dJ|dK|6      | j                  |j                  dL            | j!                  t7        dM|j                  dN                  dO       |j	                  |dP   t%        |j                  d      d dQd 6      t%        |j                  dR      d d5d 6      dS       |S )TNr   )r  channelMetadataRendererr   
externalId
channelUrlra   )r   r   r   r  playlistMetadataRendererheaderpageHeaderRendererr   pageHeaderViewModelc                 J    t        | xs dj                  d      d   dz         S )Nro   =r   z=s0)r   split)r#   s    r4   _get_uncroppedzOYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>._get_uncropped  s&    	r005a85@AAr6   avatarr   r#   avatar_uncroppedr   )r#   r   
preference)r  .)bannermobileBannertvBanner)r  imageBannerViewModelr1  rA  rB  ir  banner_uncropped"playlistSidebarPrimaryInfoRendererr  playlistHeaderRenderer)thumbnailRenderer)playlistVideoThumbnailRendererplaylistCustomThumbnailRendererr   )playlistHeaderBannerheroPlaylistThumbnailRendererr   )r  hashtagHeaderRendererrp  )r  .r   r  r  r+  .r,  c                     d|d   d   v S )Nsubscribersrk   r   r   r.  s     r4   r   zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    !F)I2F!F r6   rk   c                 &    | j                  dd      S )Nr   ro   )r*   r   s    r4   r   zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    mUW@X r6   microformatmicroformatDataRenderertagskeywordsc                 4    | xr t        j                  |       S r:   )shlexr  r   s    r4   r   zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    PQPdV[VaVabcVd r6   )ra   r   r   r   r!  r   )vanityChannelUrl)	ownerUrls.Fr   channelHandleTextr   r   )r   r   )r  .r|   c              3   `   K   | ]%  }|t        d ddddddddd	dd
dt        hf      v  ' yw)ra   dynamicTextViewModelrk   attachmentRuns.elementtype	imageTyper1  rA  clientResource	imageNameN)r   r   )r<   
image_namepage_header_view_models     r4   r>   zJYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<genexpr>   sY      I  .D/9I3PY[aWi6FVYUZG "  Is   +.)CHECK_CIRCLE_FILLEDAUDIO_BADGETr   ))stats
briefStatsnumVideosTextrD  )byliner   playlistBylineRendererrk   modified_dater   r   )r  r  r  .r  r   r  r  .r  r  . channelAboutFullMetadataRendererr   r   )r7  r   r8  rk   r   $playlistSidebarSecondaryInfoRenderer)
videoOwnervideoOwnerRendererra   )ru   r   r[   rv   z^by (.+) and \d+ others?$r   rw   r  r   )r   r   r   r   r   r   )r   r   r   )r   rQ   r   ucid_from_urlupdater*   r   append_extract_sidebar_info_rendererr   _extract_availabilityr   r   rK  r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r@   r  r  r1   metadata_rendererr   r	  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_epr1  s                          @r4   r  z7YoutubeTabBaseInfoExtractor._extract_metadata_from_tabs  s   g(/Vfjk%&7,IZIZH[9\'3d6H6H5I&JLJKK,009(  L!!,/T
 ,T3[ko p ".d*I7Ltf5V "W
	B !445FQ-.?.B5.IJ!((+,"#*  $$T+bc j''&(S_h ( j 	 & 	'F#&F< 	' -oa.@.GH&&+,"$(  $(#F#FtMq#r #/6Zjn#o !55$  'PQ"66$&ln 	"#4g> $.\]$d 66t<&LM p 6 :NCQ`FPY\g[hjm9o p ##46XY!$8QSY[^ad`e(fg m$%6FdEegj8kl-D1DHYY\kk
 	" *-UX\XlXlWm,nx}~ nD8S2EH[H[G\"]glm 	 KK- ,^TC_im n 
 --l4AZdi.jkOONI,>,>? I "HI I
 +/D&' #%'?@Bnp !11NN>1- i~~68ghj !11B C_!__^Q?\%!%1I?![D%!% 8~ "D "&!C !)%)__5MO~%D!"xx% !9;GE$77>deAC .J$U,_`fdfIKK--.JJXblv-w"//	j0IJ#33G<UW`WdWdewWx4yz  	Y'(>Fjtxy(-)@$Hdnrs
 	 r6   c           
   #     K   d x}x}t        j                  d      D ],  }t        | j                  |            }|s y t	        fdt        |      D        d      dz   }	|	t        |      k\  r y ||	d  E d {    |xs |d   d   }|d   d   t        |d       }
| j                  || j                  ||      | j                  |||            }||
j                  d      xs |
j                  d	      xs t        |      |
j                  d
      xs dd}| j                  | d| |d||d      }t        |d t              }/ y 7 խw)Nr   c              3   :   K   | ]  \  }}|d    k(  s|  yw)r   Nr   )r<   r=   r0  last_ids      r4   r>   zGYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<genexpr>9  s      P1QtW=O!Ps   r?  r   r   c                 $    | d   d   d   d   d   S )Nr  r?  r  r[   r   r   r   s    r4   r   zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>@  s!    AjM"$56R$STh$ijy$z r6   r  rZ   indexr  zOAE%3D)r   rZ   rV  r  r  nextr  )r  r  r	  r  r  r  c                     | d   d   d   d   S )Nr  twoColumnWatchNextResultsplaylistr   r   s    r4   r   zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>P  s    AjM2M$Nz$Z[e$f r6   )r  r  r~  r  rW  	enumeraterL  r   r  r  r  r*   r  rQ   )r@   rZ  r   r  r  first_idr  r  videosstartwatch_endpointr  r  rT  s                @r4   _extract_inline_playlistz4YoutubeTabBaseInfoExtractor._extract_inline_playlist3  s    (,,,7X!* 	nH$00:;FP	&(9PRTUXYYEF#ef~%%26!9T?HRj&G$z|N//$2T2TUZ\`2a!77$N 0 PG *)--i8CG'++G4CF(,,X6B(	E --&-vhZ8u) . H
 fhlnH5	n &s   A7E:E;CEc                    |j                  d      xs t        |d t              }|j                  d      xs |}t        |t        |d t                    }t	        j
                  d|      }	|r.||k7  r)|	s'| j                  |t        j                         ||      S | j                  | j                  ||||      ||      S )Nra   c                     | d   d   S )N	titleTextr   r   r   s    r4   r   zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>T  s    AkN<8 r6   r   c                     | d   d   d   d   S r  r   r   s    r4   r   zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>Y  s    *.? @AU VW\ ] r6   zMLCT|RLTD[\w-]{22}r   )r   playlist_title)r*   r   r   r   re  rf  r   r   r   r  r`  )
r@   r  r#   r  rZ  r  ra   r   playlist_urlis_known_unviewables
             r4   _extract_from_playlistz2YoutubeTabBaseInfoExtractor._extract_from_playlistR  s    W% ?8#*?ll<0;G sG]%  !ll+@+NLC/8K??!4!4!6! # # # ##))(KuM#E $ ; 	;r6   c                 H   | j                  |dt        hf      xs i }t        |ddt        hf      xs i }|j                  d      }| j	                  t        |d            }t        ||fdddd	d
d dddf	t              }t        |ddt        hf      }| j                  |'| j                  |t        j                        xs |dk(  n||dk(  nd|'| j                  |t        j                        xs |dk(  n||dk(  nt        |dt        hf      | j                  |t        j                        xs d| j                  |t        j                        xs dd      x}r|S | j                  |t        j                        s|dk(  s|dk(  st        |dt        hf      du ryy)z^
        Gets the availability of a given playlist/tab.
        @param data: response
        r  r  r  privacyr|   privacyFormdropdownFormFieldRendererdropdowndropdownRendererr8   c                     |d   d   S )NprivacyDropdownItemRenderer
isSelectedr   r.  s     r4   r   zCYoutubeTabBaseInfoExtractor._extract_availability.<locals>.<lambda>y  s    !9:<H r6   rp  iconiconTyper   r  r   NPRIVATEPRIVACY_PRIVATEUNLISTEDPRIVACY_UNLISTEDunlistedF)r   r   r   r   
needs_authPUBLICPRIVACY_PUBLICnoindexr   )rA  rQ   r   r*   r   r   r   r   r   r   r   r   boolr   r   r   )	r@   r  sidebar_rendererrI  player_header_privacyr|   privacy_setting_iconmicroformat_data_rendererr   s	            r4   rB  z1YoutubeTabBaseInfoExtractor._extract_availabilityi  s   
  >>tFjmqlrEstzxz#/xAY\`[a6b#c#igi  8 < <Y G %%l3CX&NO  )%'787EWYbHJgioq{}	  %1G`cgbh7i$j!-- :O9Z 	(F(FG 6(I5BVBb)->>hl ;P:[ 	(G(GH 7(J6CWCc)-??!";j4&=QR#vy7Z7Z[c_c//&)2P2PQYUY . 
 
< 
    OOFI$A$AB$0#'775	D67JKuTr6   c                 l    t        | d t              xs g }|D ]  }t        |fd|      }|s|c S  y )Nc                     | d   d   d   S )NsidebarplaylistSidebarRendererrO   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   r~  )r  r  rq   r~  rT   rW   s    `    r4   rA  z:YoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer  sH    "LdT ZWY 	$ 	 Dt%?OH	 r6   c           	          t        t        |dd            }|sy| j                  || j                  ||      | j	                  ||            }dd| d}| j                  |||dd	|d
      S )zf
        Reload playlists with unavailable videos (e.g. private videos, region blocked, etc.)
        r  r  Nr  zwgYCCAA=VL)r  rw   r  Fz7Redownloading playlist API JSON with unavailable videos)r  r  r  r  r  r  note)r}  r   r  r  r  r  )r@   r  r  r  is_playlistr  r  s          r4   _reload_with_unavailable_videosz;YoutubeTabBaseInfoExtractor._reload_with_unavailable_videos  s     <:<`b c++d.P.PQVX\.]33D%@ , B !WI
 %%WE%U%J & L 	Lr6   c                 P    d| j                  dt        j                               v S )Nwebpageskipr   )r   r   r   )r@   s    r4   skip_webpagez(YoutubeTabBaseInfoExtractor.skip_webpage  s&    D33F<CVCVCX3YYYr6   c                 n   d\  }}| j                  |      D ]f  }	 | j                  ||d      }| j                  ||xs d|      xs i }	 | j                  |       t        |ddd	      rUt        d
      |_	        d }h ||fS # t        $ ry}t	        |j
                  t              r>t	        |j
                  t              r|j
                  j                  dvr||_	        Y d }~| j                  ||       Y d }~ ||fS d }~ww xY w# t        $ r!}| j                  ||       Y d }~ ||fS d }~ww xY w)N)NNr  zDownloading webpage)r  ro   )i  i  r  currentVideoEndpointr  z#Incomplete yt initial data received)RetryManager_download_webpageextract_yt_initial_datar   rP   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  sK   "&&U&3 	E	00gDY0Z33GW]RW3X^\^//5  j2HJef,-RS/	2 }+ " agg'9:%aggy9QWW^^S]=]&' &&q&6 }+ " &&q&6 }s6   0BD
	DAD&DD
	D4D//D4c                     |s\| j                   rOd}d| j                  dt        j                               vr|rt	        | dd      | j                  |d       y	y	y	)
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   rJ  )r@   r  r  msgs       r4   _report_playlist_authcheckz6YoutubeTabBaseInfoExtractor._report_playlist_authcheck  su    ..yC$"9"9&I\I\I^"9"__di$e \ \ "	# #
 t4 /ur6   Nwebc                    d }| j                   s| j                  |||      \  }}|xs | j                  ||      }| j                  | j	                  |      d      xs i }	|dk7  rL|	j                  d      dk(  r8d| j                  dg       vr$d}
|rt        |
d	
      | j                  |
d	       |s)| j                  ||       | j                  |||||      }||fS )Nr  F(https://www.youtube.com/feed/recommendedtabIdentifierFEwhat_to_watchno-youtube-channel-redirectcompat_optsSThe channel/playlist does not exist and the URL redirected to youtube.com home pageTr  r  )r  default_client)r  r  extract_ytcfgr  r  r*   	get_paramr   rJ  r  _extract_tab_endpoint)r@   r#   r  r  r  webpage_fatalr  r  r  r  r  s              r4   _extract_dataz)YoutubeTabBaseInfoExtractor._extract_data  s       11#wm1TMGTAT//AE55d6Q6QRV6W_d5ekikLAA$((9=NN5T^^M[]=^^k(t<<##C4#8++E+?--c7E_m-nDU{r6   c                 F   | j                  ||      }| j                  |d|id|||dd|	      }ddd	}|j                         D ]6  \  }	t        |fd
t              }
|
s| j                  ||
|	||||d      c S  d}|rt        |d      | j                  ||       y )N)r  r  r#   r  znavigation/resolve_urlz#Downloading API parameters API JSON)	r  r  r  r  r  r  r	  r  r  browserW  )rv   r   c                     | d      S )Nr  r   )r   ep_keys    r4   r   zCYoutubeTabBaseInfoExtractor._extract_tab_endpoint.<locals>.<lambda>  s    :v9N r6   )r  r  r  )r  r  r	  r  r  r  r  r  z0Failed to resolve url (does the playlist exist?)Tr  )r  r  rO   r   rQ   r   rJ  )r@   r#   r  r  r  r  r  resolve_response	endpointsr	  r  err_noter  s               @r4   r  z1YoutubeTabBaseInfoExtractor._extract_tab_endpoint  s    ++%+W11E3<
T[chpu'.Sdr 2 t (0&I	#//+ 	fJFB-/NPTUF--#6b'u^#d . f f	f F D99Hg.r6   c           
   #   v  K   d|i}|t         u r| j                  }|r||d<   d}d| d}t        |D ch c]  }|d   	 c}      }| j                  s| j	                  ||      ni }	| j                  |	d       d g}
d }t        j                  d	      D ]  }|j                  |
d   xs i        | j                  |	| j                  |      |
      }| j                  | d| d||||	|      }t        |g| }| j                  dt        t        |            i|
      E d {    |
d   r y  y c c}w 7 w)Nr  r  ))r  twoColumnSearchResultsRendererprimaryContentsr  r  )onResponseReceivedCommandsr   r  r  )r  tabbedSearchResultsRendererr  r   r  r   r  r  )r  zquery "r  r   Fr  r   )r  r  r  r  search)r  r	  r  r  r  r  r  r  )r
   _SEARCH_PARAMStupler  _download_ytcfgr  r  r  r?  r  r  r  r   r  r~  r   )r@   r  r  r  r  content_keys
display_idkeysr  r  r  r  r  r  slr_contentss                  r4   _search_resultsz+YoutubeTabBaseInfoExtractor._search_results  su    Z((F#DN
 ugQ'
LADQABHLHYHY$$^Z@_a''U';!F!* 
	HKK)!,23//$*D*DV*L]k 0 mG++%,fXJ7HD-nTYcj , lF (>>L,,j$x?U:V-WYjkkk$Q'
	  B ls"   1D9D2C$D9#D7$	D9.
D9)F)T)NTFr  )NTr  )*__name__
__module____qualname__staticmethodrF   rX   r   r   r   r   r  r  r  r   rj  rm  rr  r  r  r  r  r  r  r  r  r  r`  rh  rB  rQ   rA  r  rD   cached_propertyr  r  r  r  r  r  r
   r  r   r6   r4   r   r   "   s5    4    ]
~$
L)VQ*D 
0Rh$L7
g"WH2V5OnOb @ @ Q QJXn>;./b JN    L( Z Z:
5&/$ N,6u r6   r   c                       e Zd ZdZdj	                  ej                  dj                  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ded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.d*edd/dd0d"d1d2d3d4d5d6g ed7d8d9d:dd8d;d<d=d>d?d@dAdBdCg dDd6dEdFdGdHdIdJdDedKdLd?dMdNdOdPdQdRdSdTdRdOdUeg dVddWdXdYdZd[dOd\dQdRdSdTdRdOdUeg dVddWd]dYd^d_dOd\dQdRdSdTdRdOdUeg dVddWd]dYd`dadOdbdQdRdSdTdRdOdUeg dVddWdcdYdddedfdgdhdidjdkdidfdledmdd"dndodYdpdqdrddsddd!gdded ddd"ddtddud"d1dvd"d1dwd"d1dxdydzd{d|g ed}d~ddddddddd?dddddg dded6ddddddddgdddd"dddddg edddd6ddddddddYddddedg dddddddddddgddddddddeg dd6dddddddgddddddg edddddddddÜddYdd"d1dddddddddgeeedϜ
dd"id ej                         gdҜdd"d1dd"d1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dd"d1dd"d1dd"d1ddd"ddd"d1dd"d1dd"d1dd"d1dd"d1d dd"dddd"ddd"d1dd"d1dd"d1dd"d1dd	d
g ddddd"d1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&dd6dd%d'd(ddgdd)d*d*g dd+dd,d-d.d/g ed6dHdd0d1dgd2d3d4d5d6dHg d7d8ed6d9d:d;d<d8d7d8d9d:d;d<d=d>d?ed@dAdBdCdAdDigd>dEd"idFdGddHdHg ddLd"dIdJdKgiidLdMdNdOdPdQdRdSdPg dTedUdVd"dIdJdKgiidLdWdXdYd!d"d#dd$d6d&g d%edd%dZd(d"dIdJdKgiidLddgd[d\d]d"dd^d_d`dadbg dHdcdddedfedgdhdddidjdkdldmdnd9g d:dodpd9d8d;d<d8ddqd>drdsdtdugiiidvgd[dwdxdyg ed:d8d9dzd{dd;d<d8d|d>drdsdtdugiiidvgd[d}d~d~g ddd1ddddg dddcddddg dddddddg dddddddeddddddddd"ddddddddddedddddd"dddddddddddedddddddddd"d1dd"d1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dd9dd8dod9d:g d;d<d8ddd8d;d<dddeedigdEd"iddddg ddd8d;d<deedeeeeeeeedŜigd"dƐdǜd>dȜdd9dd8dod9d:g d;d<d8d˜
d8d;d̐d͐dΐdΐdϐdϐdeeedϐdАdd"dҜigdEd"idӐdԜddd!gdeddddd ddd"dd֜dLddאdؐdؐdِdڐdېdedg dܐdddߜddddddddddd.dded"dddddddedd6ddddg ddddddgddddddddedddddd"dg ddddddd dd dedddddg ddddd	d
ddddddddeg eddd8ddd;d<dddddddedddgdigd>d"ddǜdFZe fd       Z ej*                  d e	 d!      Zd" Zd'd#Zd$ Zd% Zej8                  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^   UCqj7Cz7revf5maW9g5pgNcgu>   Igor DS: ИИ, Наука и Творчество  - Playlistsur   re:(?s)Добро пожаловать! Здесь сложные технологии встречаются.+\n$u2   Igor DS: ИИ, Наука и Творчество z@IgorDataSciencez(https://www.youtube.com/@IgorDataSciencezcount:19z8https://www.youtube.com/channel/UCqj7Cz7revf5maW9g5pgNcgr   )r   ra   r   r   r   r   r   r   r!  r   r   r   )r  r#   playlist_mincountrA   z%playlists, multipage, different orderz>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=dd)r   ra   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   ra   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   ra   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 playlistro   20250417zcole-dlp-test-acczUCiu-3thuViMebBjw_5nWYrAz8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrAz"https://www.youtube.com/@coletdjnzz
@coletdjnz)r   ra   r   r!  r   r9  r   r   r   r   r   r   r   r   )r  r#   rA   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_MxArx  z%https://www.youtube.com/@sergeym.6173z@sergeym.6173)r   ra   r!  r   r   r9  r   r   r   r   r   r   r   r   zHome tabzAhttps://www.youtube.com/channel/UCTwECeGqMZee77BjdoYtI2Q/featuredUCTwECeGqMZee77BjdoYtI2QzCreative Commons - Homez$md5:7cfc22824277588d26a66054f22d93c8zCreative Commonsz@creativecommonsz(https://www.youtube.com/@creativecommonsz8https://www.youtube.com/channel/UCTwECeGqMZee77BjdoYtI2Q)zcreative commonsremixculture	nonprofit)r   ra   r   r   r   r   r   r   r   r   r!  r      r  r#   rA   r  z
Videos tabz?https://www.youtube.com/channel/UCTwECeGqMZee77BjdoYtI2Q/videoszCreative Commons - Videos   zVideos tab, sorted by popularzWhttps://www.youtube.com/channel/UCTwECeGqMZee77BjdoYtI2Q/videos?view=0&sort=p&flow=gridzPlaylists tabzBhttps://www.youtube.com/channel/UCTwECeGqMZee77BjdoYtI2Q/playlistszCreative Commons - Playlists   z	Posts tabz>https://www.youtube.com/channel/UCtS3BcCw-tITPFYSvkbP0Bg/postszUCtS3BcCw-tITPFYSvkbP0Bgz,Office Hours Live with Tim Heidecker - Postsz$md5:01ec1460ea6c6e2aa47d3be9c756559cz$Office Hours Live with Tim Heideckerz@OfficeHoursLivez(https://www.youtube.com/@OfficeHoursLivez8https://www.youtube.com/channel/UCtS3BcCw-tITPFYSvkbP0Bgzcount:17)r   ra   r   r   r   r   r   r   r   r   r!  r   r      z
Search tabzChttps://www.youtube.com/c/3blue1brown/search?query=linear%20algebra(   z%3Blue1Brown - Search - linear algebra)r   ra   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)ra   r   r   r!  r   r9  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)ra   r   r   r!  r9  r   r   r   r   r   r   r   r   ic  *[Uu]navailable videos (are|will be) hidden)r  r#   rA   r  expected_warningsz!even larger playlist, 8832 videosz/http://www.youtube.com/user/NASAgovVideo/videos)r  r#   r  zTBuggy playlist: the webpage has a "Load more" button but it doesn't have more videosz>https://www.youtube.com/playlist?list=UUXw-G3eDE9trcvY2sBMM_aAzUploads from Interstellar MoviezUUXw-G3eDE9trcvY2sBMM_aAzUCXw-G3eDE9trcvY2sBMM_aAz8https://www.youtube.com/channel/UCXw-G3eDE9trcvY2sBMM_aAzInterstellar Moviez@InterstellarMoviez*https://www.youtube.com/@InterstellarMovie)ra   r   r!  r   r   r   r   r   r9  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)ra   r   r   r   r!  r   r   r   r9  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)ra   r   r   r   r   r   r!  r9  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)ra   r   r   r!  r   r   r   r   r   r9  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   extra   upload_datelicenser   
categoriesr!  r   
like_countskip_downloadzThis video is not available.)r  r#   rA   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   8GbcigMs1_cr  mp4ra   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#   rA   r  r  z/https://www.youtube.com/user/TheYoungTurks/livez=https://www.youtube.com/channel/UC1yBKRuGpC1tSM73A0ZjYjQ/livez/https://www.youtube.com/c/CommanderVideoHq/livez.A channel that is not live. Should raise errorz-https://www.youtube.com/user/numberphile/livez%https://www.youtube.com/feed/trendingz$https://www.youtube.com/feed/libraryz$https://www.youtube.com/feed/historyz*https://www.youtube.com/feed/subscriptionsz(https://www.youtube.com/feed/watch_laterz%Recommended - redirects to home page.r  z5inline playlist with not always working continuationszChttps://www.youtube.com/watch?v=UC6u0Tct-Fo&list=PL36D642111D65BE7Czhttps://www.youtube.com/coursez!https://www.youtube.com/zsecurityz*http://www.youtube.com/NASAgovVideo/videosz*https://www.youtube.com/TheYoungTurks/livez%https://www.youtube.com/hashtag/cctv9cctv9zcctv9 - All)r   ra   r!  i,  )r#   rA   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   ra   r   r9  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   ra   r!  r   r   r   r   r9  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   ra   r!  r   r   r   r9  2   )r  r#   rA   r   r  zunlisted single video playlistzHhttps://www.youtube.com/playlist?list=PLt5yu3-wZAlQLfIN0MMgp0wVV6MP3bM4_z"PLt5yu3-wZAlQLfIN0MMgp0wVV6MP3bM4_zunlisted playlist)r   ra   r   r!  r9  r   r   r   r   r   r   r   r   rA   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)ra   r   r"   r   rr   r   r   r   r#   r   r   r   r   extract_flat)r  r#   rA   rZ  r   r  zHAPI Fallback: Recommended - redirects to home page. Requires visitorDatarecommended
youtubetabr  r  )r  extractor_args)r  r#   rA   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   ra   r   r   r   r!  r   r   i  z!Query for sorting no longer works)r  r#   rA   r  r  r  z;API Fallback: Topic, should redirect to playlist?list=UU...)r   ra   r9  r   r   r   r!  r   r   r   r   )r  r#   rA   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   r9  r   r!  r   r   r   r   ra   r   r   r   r   rD  z-https://github.com/yt-dlp/yt-dlp/issues/13690)r  r#   rA   r  r  ztranslated tab namezBhttps://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/playlistsztest descriptionu#   cole-dlp-test-acc - 再生リスト)r   r!  r   r   ra   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   ra   r   r   r   r   zphttps://www.youtube.com/feed/sfv_audio_pivot?bp=8gUrCikSJwoLMkd0VmtzQk1ZRk0SCzJHdFZrc0JNWUZNGgsyR3RWa3NCTVlGTQ==sfv_audio_pivot)r   ra   r!  r   z=https://www.youtube.com/channel/UCEH7P7kyJIkS_gJf93VYbmg/liveUCEH7P7kyJIkS_gJf93VYbmgzUCEH7P7kyJIkS_gJf93VYbmg - LivezAhttps://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   ra   r   r   r   r   r   r!  r   r   r   r   r   r   )r#   rA   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:2cb3ccdafa58608fa016f1de4930ec54zNot Just Bikesz%https://www.youtube.com/@NotJustBikesz@NotJustBikes)r   ra   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:76b312b48a26c3b0e4d90e2dfc1b417du4   https://www.youtube.com/@中村悠一のあそびばu   @中村悠一のあそびば)r   ra   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   ra   r!  r   r   r   r   r   r   r   r      trendingztrending - Nowr  )r#   rA   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   ra   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   ra   r   r   )r#   rA   rZ  r  z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/livezUCQvWX73GQygcwXOTSf_VDVg - Livez+startswith:https://www.youtube.com/watch?v=)r"   r   r#   r   ra   r   r   r   r   r   r   r   r   r   1)r  playlist_items)r#   rA   rZ  r  r  zAhttps://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/channelszcole-dlp-test-acc - Channels)
r   ra   r   r   r   r   r!  r   r   r   
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   ra   r   r   r   r   r   r   r   r   r   zchannels tab removed)r#   rA   rZ  r  r  z*https://www.youtube.com/@3blue1brown/about)r   r!  ra   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   ra   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   ra   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   r9  ra   d   )r#   rA   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   ra   r   r   r   r   r   r   r   r   r!  )r  r#   r   rA   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   ra   r   r   r   r   r   r   r!  r   zCflat playlist entry credited to multiple channels / "collaborators"zHhttps://www.youtube.com/playlist?list=PLzMNc_TBkmzei1ejIkbjNUP9J7q0hmepM"PLzMNc_TBkmzei1ejIkbjNUP9J7q0hmepMz)Music for Creating, Building, Imagining 1z$md5:329cd827b1c70910e80c108cfefdb37dSebttz@Sebttzhttps://www.youtube.com/@SebttzUC-EmUaZucfuL81RYKcKjpbwz8https://www.youtube.com/channel/UC-EmUaZucfuL81RYKcKjpbw)r   ra   r   r   r   r   r   r   r   r   r!  r9  r   zThomas Bergersen - Made of FireKUokLzs947kz+https://www.youtube.com/watch?v=KUokLzs947kzTwo Steps From Hellz@TwoStepsFromHell-Officialz2https://www.youtube.com/@TwoStepsFromHell-OfficialUC3swwxiALG5c0Tvom83tPGgz8https://www.youtube.com/channel/UC3swwxiALG5c0Tvom83tPGgg     Pu@zThomas Bergersen)ra   r   r"   r   r#   r   r   r   r   r   r   r   rr   rI  75c                 P    t        j                  |      rdS t        |   |      S )NF)r   r   super)clsr#   	__class__s     r4   r   zYoutubeTabIE.suitable  s%    !**3/uJUW5Ec5JJr6   z(?P<pre>z1)(?(not_channel)|(?P<tab>/[^?#/]+))?(?P<post>.*)$c                     | j                   j                  |      j                         }|j                  d |j	                         D               |S )Nc              3   0   K   | ]  \  }}|	|df  y w)Nro   r   )r<   r  r0  s      r4   r>   z-YoutubeTabIE._get_url_mobj.<locals>.<genexpr>  s     B1	QGBs   
	)_URL_REmatch	groupdictr?  rO   )r@   r#   mobjs      r4   _get_url_mobjzYoutubeTabIE._get_url_mobj  s<    ||!!#&002B

BBr6   c                 \   |j                  d      xs dj                         }t        |t        |d            }|xr | j	                  |      d   dd  xs t        |dt
              }|rdd	ij                  ||      |fS |r| j                  d
|        dddj                  ||      |fS )Nra   ro   )r  r   r   r#   r  r   r  r   TAB_ID_SPONSORSHIPS
membershipz#Falling back to selected tab name: featuredstreams)homelive)r*   r   r   r   rU  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(LM%O P Et11':5A!"E K!#cJ 	%|c&&!8, , B8*MN
 #h
!8, 	,r6   c                 0     t         fd|D              S )Nc              3   L   K   | ]  }j                  |      d    k(    ywr   N)ra  )r<   r  r@   r`  s     r4   r>   z(YoutubeTabIE._has_tab.<locals>.<genexpr>  s&     Ss4005a8FBSr?   )rK  )r@   r  r`  s   ` `r4   _has_tabzYoutubeTabIE._has_tab  s    SdSSSr6   c                 J     | j                   g |fi | j                  ||      S r:   )r  r  )r@   r  r  s      r4   _empty_playlistzYoutubeTabIE._empty_playlist  s+    #t##Bc43S3ST[]a3bccr6   c                 >     j                  |      }t        j                  j                  t        j                  j	                  |      j                  d            } j                  dg       } j                  |      }|d   |d   |d   |d    f\  }}}}	|	r|j                  d      r|d d	 d
k(  r  j                  d|d	d   t        |d	d        S |d d	 dk(  rM j                  d| |d      }
t        |
ddt              }|st        d       j                  |t              S |d   dk(  r j                  d| | | t        |      S |dd  | | }}|	r|sd|vr| d| }|j                  d      r j                  d|        t!        |      fddD        \  }}|sQ|d   j#                  d      r=|st        dd        j                  d!|         j                  d"| t        |      S  j%                  ||      s j                  d#| t&        |      S  j)                  ||      \  }}t        |d$d%      }|rLd|vrHd&j+                  t-        d'|      ||f      } j/                  d(|         j                  |t              S  j1                  |      g }}|	r|rd|vr{ j3                  |      } j5                  ||      \  }} j7                  d)|d*| d+|       |d,k(  r j9                  ||      S |s|r j/                  d-        j;                  |d.      r#|j=                  d&j+                  |d/|f              j;                  |d0      r#|j=                  d&j+                  |d1|f             |s`|d2k7  r[|d d	 d3k7  r j9                  ||      S d4|d	d   }d"| }	  j)                  |||dd5      \  }}||}} j/                  d6| d7       nC|rA|d2k7  r<| | d }}n3|xs d2|k7  r*|d8k(  rt?        |9      |rt        d:| d;d       | | }d<|vr jA                  |||      xs |} jC                  |d=        j1                  |      g }}|rM jE                  ||||      g}|d>   jG                  t        jI                         t        jJ                  |d?        j                  d@      dAk(  r|jM                   fdB|D               n%|jM                  tO         jP                  |             tS        |      dk(  r|d>   S |rT jU                  ||      }dC}tW        |dD       rdE|dF   d	d   } j/                  dG|          jX                  ||fi |S t        |dHtZ        I      }|r j]                  |||||      S t        |dJt        I      xs |}|r3|dKk7  r j                  dL|         j                  d#| t&        |      S t        dM      # t        $ r  j9                  ||      cY S w xY w)NNr&   r(   r  prer  ru  not_channelr%   rD  r  r   MPr   	web_music)r  )r  r   urlCanonicalFr{   z#Failed to resolve album to playlistchannel_typer  z"https://music.youtube.com/channel/r   r  z/videosz8YouTube Music is not directly supported. Redirecting to c              3   :   K   | ]  }t        |d f        ywrd  )r   )r<   rV   qss     r4   r>   z-YoutubeTabIE._real_extract.<locals>.<genexpr>  s      Ub3(!; Us   )r0  r~  watchz&A video URL was given without video IDTr  zDA video URL was given without video ID. Trying to download playlist r   r   )r  .navigateActionr  r   r   r#   r   ro   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 URLrZ  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_urlr6  0c              3   J   K   | ]  }j                  |t                y wr:   )r   r   )r<   ur@   s     r4   r>   z-YoutubeTabIE._real_extract.<locals>.<genexpr>?	  s     P4??1l;Ps    #zthe Uploads (UU) playlist URLc                 *    | d   j                  d      S )Nr   ru  )rR   r   s    r4   r   z,YoutubeTabIE._real_extract.<locals>.<lambda>H	  s    1\?+E+Ed+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  rY  rZ  rZ  r   )r  r   rZ   z/livez5Unable to recognize playlist. Downloading just video zUnable to recognize tab page)/r   r+   r,   r/   r-   r0   r  rU  r*   r   r   r  r   r   r   rJ  r   rR   _yes_playlistr   r  joinr   	to_screenr  r  ra  r  rg  re  r@  r   r  r  r  r?  r   IE_NAMEextendmap_real_extractrL  r  r   r  rQ   rh  )r@   r#   r2   r  r  rT  ri  r  ru  
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_urlrZ  rp  s   `                             @r4   r  zYoutubeTabIE._real_extract  sP   ..%ll%%LL!!#&//7H/IKnn]B7!!#&%)%[$u+tF|QUVcQdMd%d"S$
-++N;r{d">wqr{mLl\cdedf\gi i!$227yA7[f 3 h#E+e,1F()NOOt\::n%18	#tfM|]df f '*!"g'3%/@c&C;&VE'C^,"Z[^Z_ `a c] U} U+D/::7C$%MX\]]"fgrfs tu??8FVac c !!+x8??28*=y(T T ((j9e
 $  C  MRS9L77G,E|$TVY[_#`aLNNu  wC  vD  E  F??<>>66t<bj$#@#S55d;L151N1N|]`1a.O.~o-@CTBUUghwgz{| ')++GT::"'8  d e==y1%%bggsJ.E&FG==x0%%bggsIt.D&EF "o&Ar{d*#33GTBB !.EEeWMFA&*&8&8e[_os&8&te (-fopuovv~A  Ox$?#&%vC!-X/A"f, &w77&(+HHYY])^imnn dVn ++=77
D%PXTXD'''=33D92g..wtTJKGAJ!-!4!4!6)11" 
 >>*+s2NNPZPPNN3t11:>?w<11:77FH9Kx!KL HR^I_`a`bIcHdeNNBBMPQ (4''EHEE  Scgi..wT8USSFVY[ g^f 	g~##&[\d[e$fg??%EhZ#PR[]eff;<<E * C#33GTBBCs   <W> >XX)r  )r  r  r  IE_DESCformatr   _RESERVED_NAMESr  _INVIDIOUS_SITES
_VALID_URLr  intr~  r   r   r   r}  _TESTSclassmethodr   re  compilerQ  rU  ra  re  rg  r   rF   r  __classcell__rN  s   @r4   r   r   -  s   G	  
/??((3DDE 
 
! ( GT&^,U QL-FK4U&)$
	 T& 8O,U QL-F4KU&)$
	%TJ $[,.AU$4)B%"O&)#'$
	ITp (H,3A*G.4U)&)$
	oTT ESTZ /Y6,'*4U$+@'
 %YT@ !Y60"'4U&C*#
 %Tf R,.A*-F)4U&)I$
 #eTJ P,0A*-F)4U&)I$
 !#ITn 0h,0A*-F)4U&)I$
 !#mTR  S,3A*-F)4U&)I$
  #QTv O,CA>-F=4U&)$#'
 !%uT\ T,<AU"O$4&)B)%#'$
	[TB EATH NGTN LMTT mY.6A'4U&$+'D
 %STz !O-,U("4$)#B
 "KL'yTb 4@aTl hO6,4U+($/,H
  'iTR	 AY.6'AU4($F-(
 !KL'Q	Tz	 =O+, U4($%!>
 "KL'y	Tb
 FY76A4U&$'+'D
  %a
TH UGTN GeM%1A+,
 T
 /#9##%&'MTv _uT| G{TB O
-
5
 S
 ;	

 3
 ,-
 D
 #
  
 z
 4
 
 #
 [
  
  I!
" H#
$ %U&)%(>%"#'&7
< T
 CCE#ATH AGTN OMTT ASTZ A>YTb 7aTh 6gTn 6mTt <sTz :yT@ 89TH HTGTP 0OTV 3UT\ <[Tb <aTh 7"

 !gTx vwT~ |[}TF 8JETN ?V6z.U(4*$H+/
 !KMvw'MTx @J,>43U($4
 !GIvw%uTb J,/

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

 !+fyk-BC
YTv D[,*A#4U&)	
 !!+fyk-BC
 4%uT^ NJ,>(4U3$4
 !!+fyk-BC
 HIvw-[TJ <IITR dY6'U&4"<;@'#
 ?'QTz &S,U-:4*@'+$
 #i&4&1A%BC/0%yTb PY6U*4!($@'+
 #i&4&1A%BC/0)_TL B#&$	
  ITd O,6$	
  _Tx S,=$	
 
uTL O,6$	
 
IT` J,0&)4UA2A3(#'$
 %]TF >,.UA&)4'C(*#'$
  %CTl R,*4U%&)AR9&$
  #iTR J	MT\ .	WTf 5,,4%A&)UK&2
  #aTH 7%

  e
ET\ k

  	YTn Q,1*-4U@'+$
 #C#&!"	
  "4(9kTh O,6$	
 #D(!"), #"'+
 $ $(3?9eTd S,3*-4U@'+
 &Q08$&Y"*-"%' D+'+
 & "4(&I%_Tj < "O"&)4$UAB)%#'$
 #iTP M,4PA/'&)U&7$
 #MTt <,"?+&#47U&)#'$
  %qT^ P,U)B4%&$(0
 !KL+WTD  )I,#4!&)A(A$U#'$'
	C Tr  x; ,"4'&)A'@#U$
o TX! VY6@A#<4U $
  :##D1; T08Y!!24FG
 $  "
M*U!TFl" K K bjjHZL0abcG
,,Td !::Y= ;Y=r6   r   c                   H    e Zd ZdZdj	                  ej                  dj                  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   )ra   r   r   r   r   r   r   r9  r   r   r!  r   r      r  "PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlYDL_safe_search)ra   r   rD  zThis playlist is private)r#   rA   r   r  embeddedzQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEur  JODA15"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEumilanz
@milan5503ro   z8https://www.youtube.com/channel/UCEI1-PVPcYXjB73Hfelbmaw20140919zUCEI1-PVPcYXjB73Hfelbmawz"https://www.youtube.com/@milan5503)ra   r   r   r   r   r   r!  r9  r   r   r   r   r   )z.[Uu]navailable videos? (is|are|will be) hiddenRetryingz	Giving up)r  r#   r   rA   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)ra   r   r   r   r   r   r   r   r!  r   r   r9  r   r  )r#   r  rA   r  TLGGrESM50VT6acwMjAyMjAxNwTr  )OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMc                     t         j                  |      ryddlm}  ||      }|j	                  dd g      d   ryt
        |   |      S )NFr   )r   r0  )r   r   yt_dlp.utilsr   r*   rL  )rM  r#   r   rp  rN  s       r4   r   zYoutubePlaylistIE.suitable	  sH      %)c]66#vq!w$$r6   c                     | j                  |      }t        j                  |      }t        dt	        |      xs d|i      }|rt        |ddi      }| j                  |t        j                         |      S )Nz https://www.youtube.com/playlistr~  r%   Tr   )	r   r   r%   r   r   r   r   r   r   )r@   r#   r   r%   s       r4   r  zYoutubePlaylistIE._real_extract	  sr    nnS)/<<SA.SM2fk24 cND#9:Cs|':':'<{SSr6   )r  r  r  r  r  r   _PLAYLIST_ID_REr  r  r  r  r  r  r  r   r  r  r  s   @r4   r   r   `	  sb   !G !&,<<((3DDE !   !G#5&&)AB(4%U$
  %( 4&6
 * b6'U'4@$
 j'* b >6(AUA4($
 LL%( ,
 ;KIFV % %Tr6   r   )&rD   r  re  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     sl      	   6  B     0H": HV o=. o=f)oT0 oTr6   