
    =Ґ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%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      V/var/www/descvideos/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      }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d/nd0}| j                  |d1d2      xs | j                  |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| j)                  |dD      dE| j+                  dFt,        G      r| j/                  |      nd dH|dI| j                  |	t        j0                        rdJn| 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 K      ||dL|dM| j                  |
t        j<                        rdNiS 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)?$)ra   accessibilityaccessibilityDatalabel )defaultexpected_typeduration)rn   group)shortBylineTextruns.r[   browseEndpointbrowseIdF)ro   get_all)channelNavigationEndpointrt   ru   )rg   .rh   stylerv   ro   badgesownerBadgeshttps://www.youtube.com/)r[   commandMetadatawebCommandMetadatar#   ro    https://www.youtube.com/watch?v=SHORTSz/shorts/https://www.youtube.com/shorts/publishedTimeText	videoInfotimestampText)upcomingEventData	startTimerv   is_upcomingstreamedwas_liveLIVEis_liveviewCountTextshortViewCountTextzno viewsr   
simpleText)r   r   concurrent_view_count
view_count	ownerTextrr   channelTitleText)rr   rs   .r[   )r}   r~   r#   )rt   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rn   
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   rp   r   overlay_stylerz   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/CDx||O<=%dnn,(p'r sH%d&8&8pX'_ik{~$j '9 ': ;H
 "ju.
 %&:<wxJ&&z2
$_. %%l8X&FG++L=,QR !;\\>   &#% 	 1
;H$
n(D3H:>C^^H.A;O T';_MTQS 	(h@blq)rs 1<M)Y__->>+v5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   )musicResponsiveListItemFlexColumnRendererri   rs   r   ri   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[   rt   ru   z!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  j                  |||t        |ddddt        hf       j                  |dg|ddd      t        |ddddddddt        ht        f
       j                  dt              r%t        |dddddddddd fd ht        f      !      S 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lockupMetadataViewModelra   r   contentImagethumbnailViewModelimagesources	final_keyoverlays.))thumbnailBottomOverlayViewModelrz   )thumbnailOverlayBadgeViewModelthumbnailBadgesthumbnailBadgeViewModelri   r   r   contentMetadataViewModelmetadataRowsmetadataPartsc                 *    j                  | d      S )NF)report_failure)r   )tr@   s    r4   r   zHYoutubeTabBaseInfoExtractor._extract_lockup_view_model.<locals>.<lambda>\  s    I^I^_`qvI^Iw r6   )ra   r   rp   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
!~~m466B4ZLAC J\\B::,GCMJ>|nANaNcMde     Zz5w	C5,R S//
=L!+=L-A=LCJ=LW` 0 b!* 4j#v.8H#/O P **+=l*S $J5zC]_m_c69?w>xz}1 @  ` 	` 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   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 r6   r   secondaryText)ra   r   r   )r  r  r  r  r   )r   rQ   r   r.  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 )NrO  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contentTextrs   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_rendererrC  r   r   r   rs   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   rU  rQ   rZ  rD  )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"reportHistoryTableTextCellRendererri   rs   .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)rn  tabletableRendererc                     | d   S ri  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:   )rD  rs  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   rs  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s!    $2D2DgQcefPgOhEi2j r6   c                 0    j                  dd| igi      S )NrO   rJ   rv  rs  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s!    1C1CWPacdOeNfDg1h r6   c                 (    j                  |       gS r:   )rI  rs  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   rs  s    r4   r   z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s    $2Q2QRS2T1U r6   )playlistVideoListRendererr   reelShelfRenderershelfRenderermusicResponsiveListItemRendererr\  rI   rH   rJ   hashtagTileRendererrichGridRendererr   )r   rU  rP   rQ   r   r*   rA  _extract_continuationrf  r  r   r  rZ  rO   )r@   parent_rendererr}  r
  r   is_rendererr   ro  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:   rz  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>  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(  xr |dk(  S )NrV    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_keysrO   r
  r`  )rI   gridPlaylistRenderergridVideoRenderergridChannelRendererr  rj  rm  r\  ra  playlistVideoListContinuationgridContinuationitemSectionContinuationsectionListContinuationr   ))r  r  .appendContinuationItemsActioncontinuationItemsFr   )ro   rn   )r   rQ   set	itertoolscountr*   write_debugaddgenerate_api_headers_extract_response_extract_visitor_datar   r  r^  rf  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_renderersc  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_tabsh  s    33GTB11$7\,II\,PP#t##MMhtne225$?**479
  	r6   c                 l	   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,                        rd9|d:<   t/        ||fd;      }| j1                  | j                  |d<      xs | j                  |d=            }t3        |      |d><   | j                  |d      |d?<   |d?   | j                  |d@      |d?<   |d?   | j                  |dA      |d?<   | j                  |d      |dB<   |dB   | j                  |dC      |dB<   |j                  d      st        |dD      }|st        | j                  |dE      dF      }| j                  |      }t        |dG      xs i }|j	                  | j5                  dH|dI|6      | j                  |j                  dJ            | j!                  t7        dK|j                  dL                  dM       |j	                  |dN   t%        |j                  d      d dOd 6      t%        |j                  dP      d d5d 6      dQ       |S )RNr   )r  channelMetadataRendererr   
externalId
channelUrlra   )r   r   r   r  playlistMetadataRendererheaderpageHeaderRendererr   pageHeaderViewModelc                 J    t        | xs dj                  d      d   dz         S )Nrm   =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  imageBannerViewModelr  r  r   ir  banner_uncropped"playlistSidebarPrimaryInfoRendererr  playlistHeaderRenderer)thumbnailRenderer)playlistVideoThumbnailRendererplaylistCustomThumbnailRendererr   )playlistHeaderBannerheroPlaylistThumbnailRendererr   )r  hashtagHeaderRendererrG  )r  .r   r  r'  r(  .r)  c                     d|d   d   v S )Nsubscribersri   r   r   _r  s     r4   r   zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    !F)I2F!F r6   ri   c                 &    | j                  dd      S )Nr   rm   )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  .rz   Tr   ))stats
briefStatsnumVideosText   )byliner   playlistBylineRendererri   modified_dater   r   )r
  r  r  .r  r   r  r
  .rj  r
  . channelAboutFullMetadataRendererr   r   )r  r   r  ri   r   $playlistSidebarSecondaryInfoRenderer)
videoOwnervideoOwnerRendererra   )rs   r   r[   rt   z^by (.+) and \d+ others?$r   ru   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   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%&7,IZIZH[9\'3d6H6H5I&JLJKK,009(  L!!,/T
 ,T3[ko p ".d*I7Ltf5V "W
	B !445FQ-.?.B5.IJ!((+,"#*  $$T+bc j''&(S_h ( j 	 & 	'F#&F< 	' -oa.@.GH&&+,"$(  $(#F#FtMq#r #/6Zjn#o !55$  'PQ"66$&ln 	"#4g> $.\]$d 66t<&LM p 6 :NCQ`FPY\g[hjm9o p ##46XY!$8QSY[^ad`e(fg m$%6FdEegj8kl-D1DHYY\kk
 	" *-UX\XlXlWm,nx}~ nD8S2EH[H[G\"]glm 	 KK- ,^TC_im n 
 --l4AZdi.jk??>9+=+=>*.D&' #%'?@Bnp !11NN>1- i~~68ghj !11B C_!__^Q?\%!%1I?![D%!% 8~ "D "&!C !)%)__5MO~%D!"xx% !9;GE$77>deAC .J$U,_`fdfIKK--.JJXblv-w"//	j0IJ#33G<UW`WdWdewWx4yz  	Y'(>Fjtxy(-)@$Hdnrs
 	 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=   r  last_ids      r4   r>   zGYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<genexpr>  s      P1QtW=O!Ps   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   r'  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>  s    AjM2M$Nz$Z[e$f r6   )r  r  rU  r  r(  	enumeratelenr   r  r  r  r*   r  rQ   )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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>  s    AkN<8 r6   r   c                     | 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  r2  )
r@   r  r#   r  r+  r  ra   r   playlist_urlis_known_unviewables
             r4   _extract_from_playlistz2YoutubeTabBaseInfoExtractor._extract_from_playlist  s    W% ?8#*?ll<0;G sG]%  !ll+@+NLC/8K??!4!4!6! # # # ##))(KuM#E $ ; 	;r6   c                    | j                  |d      xs i }t        |d      xs i }|j                  d      }| j                  t        |d            }t	        ||fddddd	d
 dddf	t
              }t        |dt              }| j                  |t        j                        s
|dk(  s|dk(  rdS | j                  |'| j                  |t        j                        xs |dk(  n||dk(  nd|'| j                  |t        j                        xs |dk(  n||dk(  n||nd| j                  |t        j                        xs d| j                  |t        j                        xs 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  privacyrz   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   rB  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_privacyrz   privacy_setting_iconmicroformats_is_unlisteds           r4   r  z1YoutubeTabBaseInfoExtractor._extract_availability1  s     >>tEijpnp#/6Z#[#a_a  8 < <Y G%%l3CX&NO  )%'787EWYbHJgioq{}	  $0HX\$^ 
 	(E(EF(H4'+;; 	#
 ## >S=^ OOFI,J,JK :,	9FZFf-1BBlp ?T>_ OOFI,K,KL ;,
:G[Gg-1CC5M5Y1_c#'??69;^;^#_#gcg"oofi6T6TU]Y]  $ "	#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   rU  )r  rX  ro   rO  rT   rW   s    `    r4   r  z:YoutubeTabBaseInfoExtractor._extract_sidebar_info_rendererZ  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  ru   r
  Fz7Redownloading playlist API JSON with unavailable videos)r  r  r  r  r  r  note)rN  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 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_webpagew  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[  rm   )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   r-  )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 )Nrc  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 pageTrr  r  )r  default_client)ra  ro  extract_ytcfgr  r  r*   	get_paramr   r-  rv  _extract_tab_endpoint)r@   r#   r  r  r  webpage_fatalr  r  r_  r  ru  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  browser(  )rt   r   c                     | d      S )Nr  r   )r   ep_keys    r4   r   zCYoutubeTabBaseInfoExtractor._extract_tab_endpoint.<locals>.<lambda>  s    :v9N r6   )r
  rd  r  )r  r  r  r  r  r  r  r  z0Failed to resolve url (does the playlist exist?)Trr  )r  r  rO   r   rQ   r   r-  )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   Frc  r   )r  r  r  r  search)r  r  r  r  r  r  r  r
  )r
   _SEARCH_PARAMStuplera  _download_ytcfgrv  r  r  r  r  r  r  r   r{  rU  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)NTFrw  )NTrw  )*__name__
__module____qualname__staticmethodrF   rX   r   r   r   r   r   r  r  r   rA  rD  rI  rZ  r^  rf  r{  r  r  r  r  r  r2  r:  r  rQ   r  r]  rD   cached_propertyra  ro  rv  r  r  r  r
   r  r   r6   r4   r   r   "   s5    4    ]
~$
L)VQ*D 
0!`F$L7
g"WH2V5OnOb @ @ Q QCJn>;.'#R JN    L( Z Z:
5&/$ N,6u r6   r   c                   2    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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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^   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   ra   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   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   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   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 playlistrm   20250417zcole-dlp-test-acczUCiu-3thuViMebBjw_5nWYrAz8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrAr   z"https://www.youtube.com/@coletdjnzz
@coletdjnz)r   ra   r   r  r   r  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_MxArF  z%https://www.youtube.com/@sergeym.6173z@sergeym.6173)r   ra   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   ra   r   r   r   r   r  r   r   r   r   r  r[  r#   rA   r  z
Videos tabz?https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videoszlex will - Videos)r   ra   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   ra   r   r   r   r   r   r   r  r   r      zPlaylists tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlistszlex will - Playlists)r   ra   r   r   r   r   r   r   r   r  r      z	Posts tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/communityzlex will - Posts)r   ra   r   r   r   r   r  r   r   r   r      zThis Community isn't available)r[  r#   rA   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   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   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)ra   r   r   r  r  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   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)ra   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)ra   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)ra   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   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   VFGoUmo74wEr  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/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  ra   r  r  r   r  r  r  )r#   rA   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.ry  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   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   ra   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   ra   r  r   r   r   r  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  r  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   rp   r   r   r   r#   r   r   r   r   extract_flat)r[  r#   rA   r+  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   r  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   r  r   r  r   r   r   r   ra   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   ra   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_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   ra   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:295758591d0d43d8594277be54584da7zNot Just Bikesz%https://www.youtube.com/@NotJustBikesz@NotJustBikes)r   ra   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   ra   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   z*https://www.youtube.com/shorts/sSM9J5YH_60sSM9J5YH_60zSHORT short)r"   r   r#   r   ra   r   r   )r#   rA   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   ra   r   r   r   r   r   r   r   r   r   1)r  playlist_items)r#   rA   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   ra   r   r   r   r   r   r   r   r   r   zchannels tab removed)r#   rA   r+  r  r`  z*https://www.youtube.com/@3blue1brown/about)r   r  ra   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   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   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  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   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  c                 P    t        j                  |      rdS t        |   |      S )NF)r   r   super)clsr#   	__class__s     r4   r   zYoutubeTabIE.suitable1  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)Nrm   r   )r<   r  r  s      r4   r>   z-YoutubeTabIE._get_url_mobj.<locals>.<genexpr>9  s     B1	QGBs   
	)_URL_REmatch	groupdictr  rO   )r@   r#   mobjs      r4   _get_url_mobjzYoutubeTabIE._get_url_mobj7  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   rm   )r  r}   r~   r#   r  r   rz  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(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)r0  )r<   r  r@   r/  s     r4   r>   z(YoutubeTabIE._has_tab.<locals>.<genexpr>S  s&     Ss4005a8FBSr?   )r.  )r@   r  r/  s   ` `r4   _has_tabzYoutubeTabIE._has_tabR  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_playlistU  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;                  |d/      r#|j=                  d%j+                  |d0|f             |s`|d1k7  r[|d d	 d2k7  r j9                  ||      S d3|d	d   }d!| }	  j)                  |||dd4      \  }}||}} j/                  d5| d6       nC|rA|d1k7  r<| | d }}n3|xs d1|k7  r*|d7k(  rt?        |8      |rt        d9| d:d      | | }d;|vr jA                  |||      xs |} jC                  |d<        j1                  |      g }}|rM jE                  ||||      g}|d=   jG                  t        jI                         t        jJ                  |d>        j                  d?      d@k(  r|jM                   fdA|D               n%|jM                  tO         jP                  |             tS        |      dk(  r|d=   S |rT jU                  ||      }dB}tW        |dC       rdD|dE   d	d   } j/                  dF|          jX                  ||fi |S t        |dGtZ        H      }|r j]                  |||||      S t        |dIt        H      xs |}|r3|dJk7  r j                  dK|         j                  d"| t&        |      S t        dL      # t        $ r  j9                  ||      cY S w xY w)MNr&   r(   r}  prer  rL  not_channelr%   r  rZ  r   MPz"https://music.youtube.com/channel/	web_music)r  )r  r  urlCanonicalFry   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        ywr3  )r   )r<   rV   qss     r4   r>   z-YoutubeTabIE._real_extract.<locals>.<genexpr>y  s      Ub3(!; Us   )r  rU  watchz&A video URL was given without video IDTrr  zDA video URL was given without video ID. Trying to download playlist r   r   )r  .navigateActionr  r}   r~   r#   r   rm   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   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   rD  )rR   r   s    r4   r   z,YoutubeTabIE._real_extract.<locals>.<lambda>  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
  r*  r+  r+  r   )rd  r   rZ   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   rR   _yes_playlistr   r  joinr   	to_screenr  r  r0  r  r6  r4  r  r   r]  rl  r  r  r   IE_NAMEextendmap_real_extractr-  r  r   r  rQ   r:  )r@   r#   r2   r  r}  r#  r8  r  rL  
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   rS  zYoutubeTabIE._real_extractX  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8	BG\g 3 i#E+e,1F()NOOt\::n%18	#tfM|]df f '*!"g'3%/@c&C;&VE'C^,"Z[^Z_ `a c] U} U+D/::7C$%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_NAMESrN  _INVIDIOUS_SITES
_VALID_URLrP  intrU  r   r   r   rN  _TESTSclassmethodr   r<  compiler   r$  r0  r4  r6  r   rF   rS  __classcell__r  s   @r4   r   r     s   G	  
/??((3DD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AU4&)
 !_jB P,(A"(4U4A!&)
 !!Ajd 0h,(A"(4A!4U&)
 !!cjF  S,+A"(A!U44&)
  !Ejh S,'A!U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

 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 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   r  r   r   r  r   r      r  "PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlYDL_safe_search)ra   r   r  zThis playlist is private)r#   rA   r   r`  embeddedzQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEur  JODA15"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEumilanz
@milan5503rm   z8https://www.youtube.com/channel/UCEI1-PVPcYXjB73Hfelbmaw20140919zUCEI1-PVPcYXjB73Hfelbmawz"https://www.youtube.com/@milan5503)ra   r   r   r   r   r   r  r  r   r   r   r   r   )z.[Uu]navailable videos? (is|are|will be) hiddenRetryingz	Giving up)r[  r#   r   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   r  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   r  )r   r   yt_dlp.utilsr   r*   r  )r  r#   r   r?  r  s       r4   r   zYoutubePlaylistIE.suitableV	  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/playlistrU  r%   Tr   )	r   r   r%   r   r   r   r   r   r   )r@   r#   r   r%   s       r4   rS  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_RErN  rb  rc  rP  rd  re  rf  r   rS  rh  ri  s   @r4   r   r     sd   !G !&,<<((3DDE !   !G #5&&)AB(4%U$
  '* 4&6
 * b6'U'4@$
 j). b >6(AUA4($
 LL'* ,
 ;QLF\ % %Tr6   r   )&rD   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     sl      	   6  B     0H": HVE=. E=R(rT0 rTr6   