o
    i"                    @   s   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	 d	eZ#G d
d de#Z$G dd deZ%dS )    N   )	BadgeTypeYoutubeBaseInfoExtractor)	YoutubeIE   )	HTTPErrornetwork_exceptions)
NO_DEFAULTExtractorErrorUserNotLivebug_reports_messageformat_field	get_firstint_or_noneparse_countparse_durationparse_qssmuggle_url
str_to_intstrftime_or_nonetraverse_objtry_getunsmuggle_urlupdate_url_queryurl_or_noneurljoinvariadicc                   @   sJ  e Zd Zedd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dGddZdd Zdd Zdd Zdd Zdd Zdd Zdd Z	 d d! Zd"d# Zd$d% ZedHd'd(Zed)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zeefd5d6Zd7d8 Ze j!d9d: Z"dHd;d<Z#dHd=d>Z$dIdAdBZ%dJdCdDZ&d?Z'e(d@fdEdFZ)d?S )KYoutubeTabBaseInfoExtractorc                    s$   dd  t  fdd}|S )Nc                 S   sr   |  ddvr	| S | dr,tj| d }|jdv r,|d tj|jdd| d< |r7t| 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_url r0   Q/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/youtube/_tab.py_smuggle%   s   


zGYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>._smugglec                    sd   t |i \} | |rd d< | | } r0|  |dr0 fdd|d D |d< |S )NTr!   entriesc                 3   s    | ]
} |  V  qd S N)copy).0i)r2   r.   r0   r1   	<genexpr>:       zYYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper.<locals>.<genexpr>)r   r!   r&   )selfr   	info_dictr2   func)r.   r1   wrapper1   s   


zFYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper)	functoolswraps)r=   r>   r0   r<   r1   passthrough_smuggled_data#   s   
z5YoutubeTabBaseInfoExtractor.passthrough_smuggled_datac                 C   sR   d}|   D ] \}}t|tsq||v r|  S |dr&|dr&|  S qd S )N)playlistRenderervideoRendererchannelRenderershowRendererreelItemRenderergridRenderer)items
isinstancedict
startswithendswith)itemknown_basic_rendererskeyrendererr0   r0   r1   _extract_basic_item_renderer>   s   
z8YoutubeTabBaseInfoExtractor._extract_basic_item_rendererc              
   C   s0  | d}t|d}| |ddp| |d}| |d}t| d}|d u r1t| |dd	}|d u rGt| jd
t|ddtd|d dd}t|dtdd}|sVt|d}| |}t|ddtd}| t|d}	| t|d}
t	dt|dtdp~d}d| }|dksd|v rd| }| |dd p| |d!pd}t
t|d"dd#}|d urd$nd%| v rd&n|d'ks| |	tjrd(nd }| |d)d*d pd}d+| v rd,n| d-|i}|d.v rd/nd0}| |d1d2p| |d3}t|d4| jdd}i d5d6d7t d8|d6|d|d9|d|d:|d;|d<|r$d=| nd d>|d?|d@t|d dAd dBdC| |dDdE| jdFtdGrJ| |nd dH|dI| |	tjrZdJn(| j| |	tjped | |	tjpnd | |	tjpwd | |	tjpd dK||dL|dM| |
tjrdNi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)?$)rZ   accessibilityaccessibilityDatalabel )defaultexpected_typeduration)rg   group)shortBylineTextruns.rT   browseEndpointbrowseIdF)rh   get_all)channelNavigationEndpointrm   rn   )r`   .ra   stylero   rh   badgesownerBadgeshttps://www.youtube.com/)rT   commandMetadatawebCommandMetadatar   rh    https://www.youtube.com/watch?v=SHORTSz/shorts/https://www.youtube.com/shorts/publishedTimeText	videoInfotimestampText)upcomingEventData	startTimero   is_upcomingstreamedwas_liveLIVEis_liveviewCountTextshortViewCountTextzno viewsr   
simpleText)r   r   concurrent_view_count
view_count	ownerTextrk   channelTitleText)rk   rl   .rT   )rv   rw   r   )rm   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rg   
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:   rQ   video_idreel_header_rendererrZ   r   ri   r   overlay_stylers   owner_badgesnavigation_urlr   	time_textscheduled_timestampr   view_count_textr   view_count_fieldr   channel_handler0   r0   r1   _extract_videoL   s   







	
z*YoutubeTabBaseInfoExtractor._extract_videoc              	   C   s*  |  |d }| |d}t|d dd d}| t|ddthfdd}|s.| | |d	}i d
dd|d|dt d|d|d|d|d|d|dt|d dd ddt|d	d| j	dd| 
|dd| 	|d	d urx| 	|dnd d| |dd| | t|dtjrdS d S ) N	channelIdrZ   "https://www.youtube.com/channel/%sr   rT   r   Fr   subscriberCountTextr   r   r   r   r   r   r   r   r   r   r   channel_follower_countvideoCountTextrx   r   r   playlist_countr   r]   r   rt   T)r   r   r   r   r   r   handle_or_noner   r   r   r   r   r   r   r   )r:   rQ   r   rZ   r   r   r0   r0   r1   _extract_channel_renderer   sn   	

z5YoutubeTabBaseInfoExtractor._extract_channel_rendererc                 c   s(   |d D ]}t |tsqt|dthf }r"| | }r!|V  q| |}t |ts-q| |d}|d}|rJ| jd| t	 ||dV  q|d}|rX| 
|V  q|d}	|	rf| |V  qtd	t|d
d t}
|
rtttfD ]}||
r| j|
|	 ||
|dV   nqxqd S )NrI   lockupViewModelrZ   
playlistId&https://www.youtube.com/playlist?list=ier   video_titlerS   r   ru   c                 S      | d d d d S )NrT   rv   rw   r   r0   xr0   r0   r1   <lambda>       z;YoutubeTabBaseInfoExtractor._grid_entries.<locals>.<lambda>)rJ   rK   r   _extract_lockup_view_modelrR   r   r&   
url_resultr   r   r   r   r   r   r   YoutubePlaylistIEr   suitable	_match_id)r:   grid_rendererrN   lockup_view_modelentryrQ   rZ   playlist_idr   r   ep_urlr   r0   r0   r1   _grid_entries   sT   






z)YoutubeTabBaseInfoExtractor._grid_entriesc                 C   s   t |d}|rt |d}| jd| t ||dS t |d}|rEt |d}|r8| jd| d| t |dS | jd	| t |dS t |d
}|rY| jd| t |dS d S )N)playlistItemDatarS   )flexColumnsr   )musicResponsiveListItemFlexColumnRendererrb   rl   r   rb   z"https://music.youtube.com/watch?v=)r   r   rZ   )rT   watchEndpointr   )rT   r   rS   z&list=r   r   (https://music.youtube.com/playlist?list=)rT   rm   rn   z!https://music.youtube.com/browse/)r   r   r   r   r   )r:   rQ   r   rZ   r   	browse_idr0   r0   r1   _music_reponsive_list_entry   s,   





z7YoutubeTabBaseInfoExtractor._music_reponsive_list_entryc                 c   sZ    | d}t|tsd S | dp| d}|r!| |E d H  | d}|r+	 d S d S )NcontentgridRendererexpandedShelfContentsRendererhorizontalListRenderer)r&   rJ   rK   r   )r:   shelf_rendererr   rQ   r0   r0   r1   _shelf_entries_from_content  s   


z7YoutubeTabBaseInfoExtractor._shelf_entries_from_contentFc                 c   s`    t |dd t}td|}|r&|rd|v rd S | |d}| j||dV  | |E d H  d S )Nc                 S   r   Nendpointrv   rw   r   r0   r   r0   r0   r1   r   "  r   z<YoutubeTabBaseInfoExtractor._shelf_entries.<locals>.<lambda>https://www.youtube.comz
/channels?rZ   )r   )r   r   r   r   r   r   )r:   r   skip_channelsep	shelf_urlrZ   r0   r0   r1   _shelf_entries   s   
z*YoutubeTabBaseInfoExtractor._shelf_entriesc                 c   s\    |d D ]&}t |tsq|dp|d}t |tsq|d}|s%q| |V  qd S )NcontentsplaylistVideoRendererplaylistPanelVideoRendererrS   )rJ   rK   r&   r   )r:   video_list_rendererr   rQ   r   r0   r0   r1   _playlist_entries0  s   


z-YoutubeTabBaseInfoExtractor._playlist_entriesc                    s  | d}|s	d S | d}|dkrt}d| }d}n|dv r*t}d| }d}n jd	| d
t  dd d S  j|||t|ddddthf j|dg|ddR ddt|ddddddddt	ht
f
 jdtdrt|dddddddddd fd d!ht
fd"S d d"S )#N	contentIdcontentTypeLOCKUP_CONTENT_TYPE_VIDEOry   r4   )LOCKUP_CONTENT_TYPE_PLAYLISTLOCKUP_CONTENT_TYPE_PODCASTr   )collectionThumbnailViewModelprimaryThumbnailz,Unsupported lockup view model content type ""T	only_oncemetadatalockupMetadataViewModelrZ   r   contentImagethumbnailViewModelimagesources	final_keyoverlays.))thumbnailBottomOverlayViewModelrs   )thumbnailOverlayBadgeViewModelthumbnailBadgesthumbnailBadgeViewModelrb   r   r   contentMetadataViewModelmetadataRowsmetadataPartsc                    s    j | ddS )NF)report_failure)r   )tr:   r0   r1   r   \      zHYoutubeTabBaseInfoExtractor._extract_lockup_view_model.<locals>.<lambda>)rZ   r   ri   r   )r&   r   r   report_warningr   r   r   r   r   r   anyr   )r:   
view_model
content_idcontent_typer   r   
thumb_keysr0   r  r1   r   <  s\   




z6YoutubeTabBaseInfoExtractor._extract_lockup_view_modelc              
   c   s6   t |ddthf }r| | }r|V  d S t |ddtfp!i }|d}|r1| |V  d S |d}|rM| jd| t || 	|ddV  d S |d	}|rt |d
dddt
hf}|scd S | jd| ft|dt |dddt
hfddd hdfftfdddthfdd| j|dddiV  d S d S )Nr   r   )rC   rF   rB   shortsLockupViewModelrS   r   r   rZ   r   entityIdonTapinnertubeCommandrU   r{   r   overlayMetadataprimaryTextaccessibilityTextc                 S   s   t d| S )Nz:(.+), (?:[\d,.]+(?:[KM]| million)?|No) views? - play Short)re	fullmatchr   r0   r0   r1   r   ~      z;YoutubeTabBaseInfoExtractor._rich_entries.<locals>.<lambda>r   secondaryText)rZ   r   r   )r  r  r  r  r  )r   rK   r   r   r&   r   r   r   r   r   r   r   r   r   )r:   rich_grid_rendererr   r   rQ   r   r   	entity_idr0   r0   r1   _rich_entries_  s`   



	
z)YoutubeTabBaseInfoExtractor._rich_entriesc                 C   s   | d}|r| |S d S )NrS   )r&   r   )r:   video_rendererr   r0   r0   r1   _video_entry  s   

z(YoutubeTabBaseInfoExtractor._video_entryc                 C   s4   t dt|d}|r| j|t | |ddS d S )Nzhttps://youtube.com)onTapCommandrv   rw   r   hashtag)r   rZ   )r   r   r   r   r   r   )r:   hashtag_tile_rendererr   r0   r0   r1   _hashtag_tile_entry  s   z/YoutubeTabBaseInfoExtractor._hashtag_tile_entryc                 c   s    t |dd t}|sd S t |dd tpi }|d}|r(| |}|r(|V  t |dd t}|r@| jd| t |dV  t |dd tpIg }|D ].}t	|tsTqLt |d	d t}	|	s_qLt
|	seqLt
|	}
||
kroqL| j|	t
 |
dV  qLd S )
Nc                 S      | d d S )NpostbackstagePostRendererr0   r   r0   r0   r1   r     r.  zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>c                 S   r9  )NbackstageAttachmentrC   r0   r   r0   r0   r1   r     r.  rS   c                 S      | d d d S )Nr<  rB   r   r0   r   r0   r0   r1   r         r   r   c                 S   r9  )NcontentTextrl   r0   r   r0   r0   r1   r     r.  c                 S   r=  )NrT   urlEndpointr   r0   r   r0   r0   r1   r     r>  )r   rK   r&   r   r   r   r   r   listrJ   r   r   r   )r:   post_thread_rendererpost_rendererr3  r   r   r   rl   runr   ep_video_idr0   r0   r1   _post_thread_entries  sP   








z0YoutubeTabBaseInfoExtractor._post_thread_entriesc                 c   sn    | d}t|tsd S |D ]%}| d}t|tr$| |E d H  q| d}t|tr4| |V  qd S )Nr   backstagePostThreadRendererrC   )r&   rJ   rA  rK   rF  r4  )r:   post_thread_continuationr   r   rQ   r0   r0   r1   !_post_thread_continuation_entries  s   





z=YoutubeTabBaseInfoExtractor._post_thread_continuation_entriesc                 c   s*    t |dD ]}| td|tV  qd S )N)rows.reportHistoryTableRowRenderercells.reportHistoryTableCellRenderercell"reportHistoryTableTextCellRendererrb   rl   .rT   rv   rw   r   r   )r   r   r   r   )r:   rQ   r   r0   r0   r1   _report_history_entries  s   z3YoutubeTabBaseInfoExtractor._report_history_entriesc                 #   s   d g d d < t |dd tpg }|D ]}t|tsqt|dddtd}|s[|drA|d D ]}|V  q3| d< n|d	rZt|d
}|E d H  | d< qt |dd tpdg }|D ]\}	t|	tsoqgj	j
j
jfddjfddfddfddfdd fddfddd}
|	 D ]\}}||
vrq|
| |D ]}|r|V  q| d<  qg d sψ| d< q d s݈| d< d S d S )Nc                 S      | d S Nr   r0   r   r0   r0   r1   r         z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>itemSectionRenderermusicShelfRenderermusicShelfContinuationrx   richItemRendererr   reportHistorySectionRenderer)rX  tabletableRendererc                 S   rQ  rR  r0   r   r0   r0   r1   r     rS  c                         | gS r4   )r   r   r  r0   r1   r     r.  c                    r[  r4   )r4  r   r  r0   r1   r     r.  c                         dd| igiS )NrI   rB   r   r   r  r0   r1   r     r   c                    r\  )NrI   rD   r]  r   r  r0   r1   r     r   c                    r[  r4   )r8  r   r  r0   r1   r     r.  c                        |  S r4   _extract_entriesr   continuation_listr:   r0   r1   r     r.  c                    r[  r4   )r   r   r  r0   r1   r     r.  )playlistVideoListRendererr   reelShelfRenderershelfRenderermusicResponsiveListItemRendererrG  rC   rB   rD   hashtagTileRendererrichGridRendererr   )r   rA  rJ   rK   r   r&   r2  _extract_continuationrP  r   r   r   rF  rI   )r:   parent_rendererrb  r   r   is_rendererr   rY  isr_contentsisr_contentknown_renderersrP   rQ   r0   ra  r1   r`    sj   










z,YoutubeTabBaseInfoExtractor._extract_entriesc                 #   s8   d g  fdd}t |dd t}|sd S t |dd tp(t |dd tp(i }||E d H   d }	t }
tdD ]}|	sC d S |	d}|d urX||
v rXd	  d S |
| j|||d
}j	| d| |	||dddddddddd ffd}|s d S d }	
|p|}jdfjdfjdfjdfjdf|df|dfjdfjdfjd fjd fjd f|d fjdfd}t|dddd}t|dd ti d}d }|D ])}||vrq|| \}}|r||in|}d g ||E d H   d p|}	q|	pd|gi}	|	s|s d S q<d S )Nc                    r^  r4   r_  r   ra  r0   r1   r     r.  z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>c                 S   rQ  )Nr   r0   r   r0   r0   r1   r     rS  c                 S   rQ  )NsectionListRendererr0   r   r0   r0   r1   r     rS  c                 S   rQ  )Nrh  r0   r   r0   r0   r1   r     rS  r   r   continuationz5Detected YouTube feed looping - assuming end of feed.ytcfgdelegated_session_idvisitor_data page continuationContentsonResponseReceivedActionsonResponseReceivedEndpointsresponseContextserviceTrackingParams.paramsc                 S   s   | dko|dkS )NrP    GetRecommendedMusicPlaylists_ridr0   )kvr0   r0   r1   r   &  r>  )item_idqueryheadersrr  check_get_keysrI   r   rJ  )rC   gridPlaylistRenderergridVideoRenderergridChannelRendererr   rT  rW  rG  rK  playlistVideoListContinuationgridContinuationitemSectionContinuationsectionListContinuationr   ))rw  rx  .appendContinuationItemsActioncontinuationItemsFr   )rh   rg   )r   rK   set	itertoolscountr&   write_debugaddgenerate_api_headers_extract_response_extract_visitor_datar   r   rI  rP  r   ri  )r:   tabr  rr  rs  rt  extract_entriestab_contentrj  rp  seen_continuationspage_numcontinuation_tokenr  responsern  continuation_itemscontinuation_itemvideo_items_rendererrP   r=   
parent_keyr0   ra  r1   _entries
  s   


	z$YoutubeTabBaseInfoExtractor._entriesTc                 C   s,   | D ]}| dr|  S q|rtdd S )NselectedzUnable to find selected tab)r&   r
   )tabsfataltab_rendererr0   r0   r1   _extract_selected_tab[  s   
z1YoutubeTabBaseInfoExtractor._extract_selected_tabc                 C   s   t | dtdS )N)r   twoColumnBrowseResultsRendererr  .)tabRendererexpandableTabRendererrx   )r   rK   )r  r0   r0   r1   _extract_tab_renderersc  s   z2YoutubeTabBaseInfoExtractor._extract_tab_renderersc                 C   sz   |  ||}| |}|d  t|dd7  < |d  t|dd7  < | j| ||d || ||| ||fi |S )NrZ   z - %sexpandedTextr   )_extract_metadata_from_tabsr  r   playlist_resultr  _extract_delegated_session_idr  )r:   r  rr  datar  r  selected_tabr0   r0   r1   _extract_from_tabsh  s   



z.YoutubeTabBaseInfoExtractor._extract_from_tabsc                 C   s  d|i}t |dtd}|r1t |d| jhfd| jhf}||d|d |d r0|d |d< nt |d	td}t |d
dddthf}dd }| |d}|rb||d d }	|	rb||	ddd | |dpo| j|ddd}
|
D ]}d|d< qr|
r||
d d }|r|
|ddd | |d}t |dtd}| |d }| |d!}|t |dp| 	|d"p|d | 
|| |d#pt |d$d%d&d'd(d)d* d+dthtf
t|d,d* t |d-d.d/d'thfpt |d0d1d* hd'f|p|| |
 d2 t |d3| jhfd4d5pt |d
d'd6| jhfd4d5}|r"||t|d d7d d8d9 | t |d:d4d5}| |tjr8d;|d<< t||fd=}| | 	|d>pM| 	|d?}t||d@< | |d|dA< |dA d u rl| |dB|dA< |dA d u r{| |dC|dA< | |d|dD< |dD d u r| |dE|dD< |dst |dF}|st | |dGdH}| 	|}t |dIpi }|| jdJ|dK|d8| |dL| tdM|dNdO ||dP t|dd dQd d8t|dRd d7d d8dS |S )TNr   )r  channelMetadataRendererrx   
externalId
channelUrlrZ   )r   r   r   r  playlistMetadataRendererheaderpageHeaderRendererr   pageHeaderViewModelc                 S   s   t | pddd d S )Nrf   =r   z=s0)r   split)r   r0   r0   r1   _get_uncropped  s   zOYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>._get_uncropped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  hashtagHeaderRendererr6  )r  .r   r  r  r  .r  c                 S   s   d|d d v S )Nsubscribersrb   r   r0   _r~  r0   r0   r1   r     r>  zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>rb   c                 S   s   |  ddS )Nr   rf   )r&   r   r0   r0   r1   r     r.  microformatmicroformatDataRenderertagskeywordsc                 S   s   | ot | S r4   )shlexr  r   r0   r0   r1   r     r  )rZ   r   r   r   r  r   )vanityChannelUrl)	ownerUrls.Fr   channelHandleTextr   r   )r   r   )r  .rs   Tr   ))stats
briefStatsnumVideosText   )byliner   playlistBylineRendererrb   modified_dater   r   )r   r  r  .r  r   ro  r   .rT  r   . channelAboutFullMetadataRendererr   r   )r  r   r  rb   r   $playlistSidebarSecondaryInfoRenderer)
videoOwnervideoOwnerRendererrZ   )rl   r   rT   rm   z^by (.+) and \d+ others?$r   rn   r   r   )r   r   r   r   r   r   )r   r   r   )r   rK   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  r-   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_epr0   r0   r1   r  v  s   








z7YoutubeTabBaseInfoExtractor._extract_metadata_from_tabsc              	   #   s*   d  }  }t dD ]}t| |}|s d S t fddt|D dd }	|	t|kr3 d S ||	d  E d H  |pC|d d }|d d  t|dd }
| j|| 	||| 
|||d	}||
d
pi |
dpqt||
dpwdd}| j| d| |d||dd}t|dd t}qd S )Nr   c                 3   s$    | ]\}}|d   kr|V  qdS )r   Nr0   )r6   r7   r~  last_idr0   r1   r8        " zGYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<genexpr>r   r   c                 S   s   | d d d d d S )Nr   r  r   rT   r   r0   r   r0   r0   r1   r     s    zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>rq  rS   indexr{  zOAE%3D)r   rS   r  r{  ru  nextr   )r  r  r   r  rr  r  c                 S   s   | d d d d S )Nr   twoColumnWatchNextResultsplaylistr0   r   r0   r0   r1   r     r   )r  r  rA  r   r  	enumeratelenr   r  r  r  r&   r  rK   )r:   r  r   r  rr  first_idr  r  videosstartwatch_endpointr  r  r0   r  r1   _extract_inline_playlist  sB    
z4YoutubeTabBaseInfoExtractor._extract_inline_playlistc           
      C   s   | dpt|dd t}| dp|}t|t|dd t}td|}	|r8||kr8|	s8| j|t ||dS | j	| 
||||||dS )	NrZ   c                 S   r9  )N	titleTextr   r0   r   r0   r0   r1   r     r.  zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>r   c                 S   r   r   r0   r   r0   r0   r1   r   !  r   zMLCT|RLTD[\w-]{22}r   )r   playlist_title)r&   r   r   r   r,  r-  r   r   r   r  r  )
r:   r  r   r  r  rr  rZ   r   playlist_urlis_known_unviewabler0   r0   r1   _extract_from_playlist  s$   

z2YoutubeTabBaseInfoExtractor._extract_from_playlistc                 C   s(  |  |dpi }t|dpi }|d}| t|d}t||fddddd	d
d dddf	td}t|dtd}| |tj	sF|dksF|dkrHdS | j
|durY| |tjpX|dkn	|dura|dknd|durq| |tjpp|dkn|dury|dkn|dur|nd| |tjpd| |tjpd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  privacyrs   privacyFormdropdownFormFieldRendererdropdowndropdownRendererr3   c                 S   s   |d d S )NprivacyDropdownItemRenderer
isSelectedr0   r  r0   r0   r1   r   A  r.  zCYoutubeTabBaseInfoExtractor._extract_availability.<locals>.<lambda>r  iconiconTyperx   )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_privacyrs   privacy_setting_iconmicroformats_is_unlistedr0   r0   r1   r  1  sJ   

z1YoutubeTabBaseInfoExtractor._extract_availabilityc                    sB   t | dd tp	g }|D ]}t | fdd|}|r|  S qd S )Nc                 S   r=  )NsidebarplaylistSidebarRendererrI   r0   r   r0   r0   r1   r   ]  r>  zLYoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer.<locals>.<lambda>c                    s   |   S r4   r0   r   info_rendererr0   r1   r   _  rS  )r   rA  )r  r%  rh   r  rN   rQ   r0   r$  r1   r  Z  s   
z:YoutubeTabBaseInfoExtractor._extract_sidebar_info_rendererc              	   C   s`   t t|dd}|sdS | j|| ||| ||d}dd| d}| j|||dd	|d
dS )zf
        Reload playlists with unavailable videos (e.g. private videos, region blocked, etc.)
        r  r  Nrq  zwgYCCAA=VL)r{  rn   r   Fz7Redownloading playlist API JSON with unavailable videos)r  r  r  r  r  rr  note)r  r   r  r  r  r  )r:   r  r  rr  is_playlistr  r  r0   r0   r1   _reload_with_unavailable_videosc  s"   
z;YoutubeTabBaseInfoExtractor._reload_with_unavailable_videosc                 C   s   d| j dt dv S )Nwebpageskipr   )r   r   r   r  r0   r0   r1   skip_webpagew  s   z(YoutubeTabBaseInfoExtractor.skip_webpagec                 C   s(  d\}}| j |dD ]}z| j||dd}| j||pd|dp i }W n8 tyZ } z,t|jtrEt|jtr<|jjdvrE||_	W Y d }~q
| j
||d W Y d }~ ||fS d }~ww z| | W n ty } z| j
||d W Y d }~ ||fS d }~ww t|ddd	std
|_	d }q
q
||fS )N)NNr  zDownloading webpage)r'  rf   )i  i  r   currentVideoEndpointrw  z#Incomplete yt initial data received)RetryManager_download_webpageextract_yt_initial_datar
   rJ   causer   r   statuserror_error_or_warning_extract_and_report_alertsr   )r:   r   r  r  r*  r  retryer0   r0   r1   _extract_webpage{  s:   	
z,YoutubeTabBaseInfoExtractor._extract_webpagec                 C   sT   |s&| j r(d}d| jdt dvr|rt| ddd| j|dd d	S d	S d	S )
z>Use if failed to extract ytcfg (and data) from initial webpagezePlaylists that require authentication may not extract correctly without a successful webpage download	authcheckr+  r   z. If you are not downloading private content, or your cookies are only for the first account and channel, pass "--extractor-args youtubetab:skip=authcheck" to skip this checkTexpectedr	  N)is_authenticatedr   r   r   r
   r  )r:   rr  r  msgr0   r0   r1   _report_playlist_authcheck  s   
z6YoutubeTabBaseInfoExtractor._report_playlist_authcheckNwebc                 C   s   d }| j sG| j|||d\}}|p| ||}| j| |ddp"i }	|dkrG|	ddkrGd| dg vrGd}
|r@t|
d	d
| j|
d	d |sZ| j	||d | j
|||||d}||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,  r9  extract_ytcfgr  r  r&   	get_paramr
   r  r?  _extract_tab_endpoint)r:   r   r  rr  r  webpage_fatalrG  r  r*  r  r>  r0   r0   r1   _extract_data  s    z)YoutubeTabBaseInfoExtractor._extract_datac                    s   | j ||d}| j|d|id|||dd|d	}ddd	}| D ]\ }	t| fd
dt}
|
r?| j||
|	||||dd  S q d}|rJt|dd| || d S )N)rr  rG  r   r   znavigation/resolve_urlz#Downloading API parameters API JSON)	r  r  r  r  rr  r  r   r'  rG  browser  )rm   r   c                    s   | d   S )Nr   r0   r   ep_keyr0   r1   r     r.  zCYoutubeTabBaseInfoExtractor._extract_tab_endpoint.<locals>.<lambda>)r   r.  rw  )r  r  r   r  rr  r  rG  r  z0Failed to resolve url (does the playlist exist?)Tr;  )r  r  rI   r   rK   r
   r  )r:   r   r  rr  r  rG  r  resolve_response	endpointsr   r{  err_noter0   rN  r1   rJ    s&   

z1YoutubeTabBaseInfoExtractor._extract_tab_endpointc              
   c   s   d|i}|t u r| j}|r||d< d}d| d}tdd |D }| js,| ||ni }| j|dd	 d g}	d }
td
D ]E}||	d pHi  | j	|| 
|
|d}| j| d| d|||||d}
t|
g|R  }| dtt|i|	E d H  |	d s d S q?d S )Nr  r{  ))r   twoColumnSearchResultsRendererprimaryContentsro  r   )onResponseReceivedCommandsr   r  r  )r   tabbedSearchResultsRendererr  r   r  r   ro  r   )rv  zquery "r  c                 S   s   h | ]}|d  qS )r   r0   )r6   keysr0   r0   r1   	<setcomp>  r   z>YoutubeTabBaseInfoExtractor._search_results.<locals>.<setcomp>Fr-  r   r   )rr  rt  rG  ru  search)r  r   r  rG  r  rr  r  r   )r	   _SEARCH_PARAMStupler,  _download_ytcfgr?  r  r  r  r  r  r  r   r`  rA  r   )r:   r  r{  rG  r  content_keys
display_idr  rr  rb  rY  r  r  slr_contentsr0   r0   r1   _search_results  s8   z+YoutubeTabBaseInfoExtractor._search_results)F)T)NTFr@  )NTr@  )*__name__
__module____qualname__staticmethodrA   rR   r   r   r   r   r   r   r   r   r2  r4  r8  rF  rI  rP  r`  r  r  r  r  r  r  r  r  rK   r  r)  r?   cached_propertyr,  r9  r?  rL  rJ  rZ  r	   r`  r0   r0   r0   r1   r   "   sV    

_&+
#&$
7Q
 )




r   c                       s  e Zd ZdZdjejdejd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de 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dZede	 dZdd ZdddZdd Zdd Zejdd Z  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   rZ   r   r   r   r   r   r   r  r   r   )r'  r   playlist_mincountr;   z%playlists, multipage, different orderz>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=dd)r   rZ   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   rZ   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   rZ   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 playlistrf   20250417zcole-dlp-test-acczUCiu-3thuViMebBjw_5nWYrAz8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrAr   z"https://www.youtube.com/@coletdjnzz
@coletdjnz)r   rZ   r   r  r   r  r   r   r   r   r   r   r   r   )r'  r   r;   r   zempty playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfz"PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfzyoutube-dl empty playlistz	Sergey M.20230921UCmlqkdCBesrv2Lak1mF_MxAz8https://www.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxAr  z%https://www.youtube.com/@sergeym.6173z@sergeym.6173)r   rZ   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   rZ   r   r   r   r   r  r   r   r   r   r  r'  r   r;   rk  z
Videos tabz?https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videoszlex will - Videos)r   rZ   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   rZ   r   r   r   r   r   r   r  r   r      zPlaylists tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlistszlex will - Playlists)r   rZ   r   r   r   r   r   r   r   r  r      z	Posts tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/communityzlex will - Posts)r   rZ   r   r   r   r   r  r   r   r   r      zThis Community isn't available)r'  r   r;   rk  r+  z
Search tabzChttps://www.youtube.com/c/3blue1brown/search?query=linear%20algebra(   z%3Blue1Brown - Search - linear algebra)r   rZ   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)rZ   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)rZ   r   r   r  r  r   r   r   r   r   r   r   r   ic  *[Uu]navailable videos (are|will be) hidden)r'  r   r;   rk  expected_warningsz!even larger playlist, 8832 videosz/http://www.youtube.com/user/NASAgovVideo/videos)r'  r   rt  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)rZ   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)rZ   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)rZ   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)rZ   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   extrZ   upload_datelicenser   
categoriesr  r   
like_countskip_downloadzThis video is not available.)r'  r   r;   r{  r+  add_iezMhttps://www.youtubekids.com/watch?v=Agk7R8I8o5U&list=PUZ6jURNr1WQZCNHF0ao-c0gz5https://www.youtube.com/watch?v=MuAGGZNfUkU&list=RDMMz=https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQ/liver   VFGoUmo74wEr  mp4rZ   r  r   r  zNews & Politicsr  r  r   r   zSky Newsr   zUCoMdktPbSTixAyNGwb-UYkQ	age_limitr   r   z?re:https?://i\.ytimg\.com/vi/[^/]+/maxresdefault(?:_live)?\.jpgplayable_in_embedrelease_datezre:\d+r   r   z8https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQz https://www.youtube.com/@SkyNewsz@SkyNews
livestream)
r   r   r   r   r   r   r   r   
media_typer   z"Ignoring subtitle tracks found in )r   r;   r{  r  z/https://www.youtube.com/user/TheYoungTurks/livea48o2S1cPooz The Young Turks - Live Main Show20150715z$md5:438179573adcdff3c97ebb1ee632b891)zCenk Uygur (TV Program Creator)z$The Young Turks (Award-Winning Work)zTalk Show (TV Genre))	r   r  rZ   r  r  r   r  r  r  )r   r;   r{  rt  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.rA  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   rZ   r  i,  )r   r;   rk  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   rZ   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   rZ   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   rZ   r  r   r   r   r  2   )r'  r   r;   r   r  zunlisted single video playlistzHhttps://www.youtube.com/playlist?list=PLt5yu3-wZAlQLfIN0MMgp0wVV6MP3bM4_z"PLt5yu3-wZAlQLfIN0MMgp0wVV6MP3bM4_zunlisted playlist)r   rZ   r   r  r  r   r   r   r   r   r   r   r   r;   z@Big Buck Bunny 60fps 4K - Official Blender Foundation Short Filmzaqz-KE-bpKQr   Youtubei{  UCSMOQeBJ2RAnuFungnQOxLgz8https://www.youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLgz+https://www.youtube.com/watch?v=aqz-KE-bpKQBlenderz@BlenderOfficialz(https://www.youtube.com/@BlenderOfficial)rZ   r   r   r   ri   r   r   r   r   r   r   r   r   extract_flat)r'  r   r;   r  r   r{  zHAPI Fallback: Recommended - redirects to home page. Requires visitorDatarecommended
youtubetabr+  r*  )r  extractor_args)r'  r   r;   r   r{  z1API Fallback: /videos tab, sorted by oldest firstzJhttps://www.youtube.com/user/theCodyReeder/videos?view=0&sort=da&flow=gridUCu6mSoMNzHQiBIOCkHUa2AwzCody'sLab - Videosz$md5:d083b7c2f0c67ee7a6c74c3e9b4243faz	Cody'sLabz8https://www.youtube.com/channel/UCu6mSoMNzHQiBIOCkHUa2Aw)r   rZ   r   r   r   r  r   r   i  z!Query for sorting no longer works)r'  r   r;   rk  r{  r+  z;API Fallback: Topic, should redirect to playlist?list=UU...)r   rZ   r  r   r   r   r  r   r   r   r   )r'  r   r;   rk  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   rZ   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   rZ   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   rZ   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   rZ   r   r   r   r   r   r  r   r   r   r   r   )r   r;   r   z,https://www.youtube.com/@NotJustBikes/shortszUC0intLFzLaudFG-xAvUEO-AzNot Just Bikes - Shortszcount:10z8https://www.youtube.com/channel/UC0intLFzLaudFG-xAvUEO-Az$md5:295758591d0d43d8594277be54584da7zNot Just Bikesz%https://www.youtube.com/@NotJustBikesz@NotJustBikes)r   rZ   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   rZ   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   rZ   r  r   r   r   r   r   r   r   r      trendingztrending - NowrF  )r   r;   rk  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   rZ   r   r   r   r   r  r   r   r   z*https://www.youtube.com/shorts/sSM9J5YH_60sSM9J5YH_60zSHORT short)r   r   r   r   rZ   r   r   )r   r;   r  r{  z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/livezUCQvWX73GQygcwXOTSf_VDVg - Livez+startswith:https://www.youtube.com/watch?v=)r   r   r   r   rZ   r   r   r   r   r   r   r   r   r   1)r  playlist_items)r   r;   r  r{  rk  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   rZ   r   r   r   r   r   r   r   r   r   zchannels tab removed)r   r;   r  r{  r+  z*https://www.youtube.com/@3blue1brown/about)r   r  rZ   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   rZ   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   rZ   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  rZ   d   )r   r;   rk  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   rZ   r   r   r   r   r   r   r   r  )r'  r   r   r;   zestreams tab, some scheduled streams. Empty intermediate response with only continuation - must followz*https://www.youtube.com/@sbcitygov/streamszUCH6-qfQwlUgz9SAf05jvc_w	sbcitygovzsbcitygov - Livez$md5:ca1a92059835c071e33b3db52f4a6d67z
@sbcitygovz"https://www.youtube.com/@sbcitygovz8https://www.youtube.com/channel/UCH6-qfQwlUgz9SAf05jvc_w)r   r   r   rZ   r   r   r   r   r   r   r  c                    s   t |rdS t |S )NF)r   r   super)clsr   	__class__r0   r1   r   1  s   zYoutubeTabIE.suitablez(?P<pre>z1)(?(not_channel)|(?P<tab>/[^?#/]+))?(?P<post>.*)$c                 C   s,   | j | }|dd | D  |S )Nc                 s   s$    | ]\}}|d u r|dfV  qd S )Nrf   r0   )r6   r}  r~  r0   r0   r1   r8   9  r  z-YoutubeTabIE._get_url_mobj.<locals>.<genexpr>)_URL_REmatch	groupdictr  rI   )r:   r   mobjr0   r0   r1   _get_url_mobj7  s   zYoutubeTabIE._get_url_mobjr   c                 C   s   | dpd }t|t|d}|r| |d dd  p$t|dtd}|r1dd	i |||fS |r;| d
|  ddd |||fS )NrZ   rf   )r   rv   rw   r   r  r   rB  rx   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_idr0   r0   r1   _extract_tab_id_and_name<  s&   

z%YoutubeTabIE._extract_tab_id_and_namec                    s   t  fdd|D S )Nc                 3   s"    | ]}  |d  kV  qdS r   N)r  )r6   r  r:   r  r0   r1   r8   S  s     z(YoutubeTabIE._has_tab.<locals>.<genexpr>)r   )r:   r  r  r0   r  r1   _has_tabR  s   zYoutubeTabIE._has_tabc                 C   s   | j g |fi | ||S r4   )r  r  )r:   r  r  r0   r0   r1   _empty_playlistU  s   zYoutubeTabIE._empty_playlistc                    s   |}tjtj|jdd}dg }|}|d |d |d |d  f\}}}}	|	r|dr|d d	 d
krR	d|d	d   t
|d	d  S |d d	 dkryjd| |dd}
t|
ddtd}|sstd	|t
S |d dkr	d| | | t
|S |dd  | | }}|	r|sd|vr| d| }|drd|  t|  fdddD \}}|s|d dr|stddd d!|  	d"| t
|S ||s	d#| t|S ||\}}t|d$dd%}|r(d|vr(d&td'|||f}d(|  	|t
S |g }}|	r|rd|vr|}||\}}d)|d*| d+| |d,kra||S |s|rd- |d.r~|d&|d/|f |d0r|d&|d1|f |s|d2kr|d d	 d3kr||S d4|d	d   }d"| }zj|||ddd5\}}W n ty   || Y S w ||}}d6| d7 n7|r|d2kr| | d }}n%|pd2|kr|d8krt|d9|rtd:| d;dd | | }d<|vr) |||p(|}j!|dd= |g }}|rR"||||g}|d> #t
$ t
j%|d? d@dAkrg|&fdBd|D  n	|&t'j(| t)|dkr{|d> S |r*||}dC}t+|dDdE rdF|dG d	d   }dH|  j,||fi |S t|dIt-dJ}|r.|||||S t|dKtdJp|}|r|dLkr؈dM|  	d#| t|S tdN)ONr"   r$   rE  prer  r:  not_channelr!   r  r&  r   MPz"https://music.youtube.com/channel/	web_music)rG  )r  r  urlCanonicalFrr   z#Failed to resolve album to playlistchannel_typerM  r   rD  z/videosz8YouTube Music is not directly supported. Redirecting to c                 3   s    | ]
}t  |d fV  qdS r  )r   )r6   rP   )qsr0   r1   r8   y  r9   z-YoutubeTabIE._real_extract.<locals>.<genexpr>)r~  rA  watchz&A video URL was given without video IDTr;  zDA video URL was given without video ID. Trying to download playlist r   ry   )rw  .navigateActionr   rv   rw   r   r   rf   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)rr  r  rK  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   s    | ]	}  |tV  qd S r4   )r   r   )r6   ur  r0   r1   r8     s    zthe Uploads (UU) playlist URLc                 S   s   | d  dS )Nr   r  )rL   r   r0   r0   r1   r     r  z,YoutubeTabIE._real_extract.<locals>.<lambda>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  rx   )r.  r   rS   z/livez5Unable to recognize playlist. Downloading just video zUnable to recognize tab page)/r   r'   r(   r+   r)   r,   rI  r  r&   r   r   rJ  r   r   r
   r  r   rL   _yes_playlistr   rL  joinr   	to_screenr  r  r  r  r  r  r  r   r)  r6  r  r  r   IE_NAMEextendmap_real_extractr  r  r   r  rK   r  )r:   r   r.   r  rE  r  r  r  r:  
is_channelmdatamurloriginal_tab_idr^  r   r   r  rr  redirect_urlr  
extra_tabsr  selected_tab_idselected_tab_namepl_idpl_urlr3   r  uploads_urlr  r0   )r  r:   r1   r  X  s  

&










zYoutubeTabIE._real_extract)r   )ra  rb  rc  IE_DESCformatr   _RESERVED_NAMESr  _INVIDIOUS_SITES
_VALID_URLr  intrA  r   r   r   r  _TESTSclassmethodr   r,  compiler  r  r  r  r  r   rA   r  __classcell__r0   r0   r  r1   r     s   
$6GK^p     $  5  H  Z  ]  `  d  w           $    8    M    `    c    w    z    }	
     !      2      5      8      <      ?      B      E      H      K      O      S      V      Y      \      _      g      j      n      s       	                &	        4        Z        g
        {                             *          >          S          _          h          q          {                       !            3            8            =            N            X            a            }                           ?              Q              c              w                               "                4r   c                       s   e Zd ZdZdjejdejd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:d;Zd<d= Z  ZS )>r   zYouTube playlistsa  (?x)(?:
                        (?:https?://)?
                        (?:\w+\.)?
                        (?:
                            (?:
                                youtube(?:kids)?\.com|
                                {invidious}
                            )
                            /.*?\?.*?\blist=
                        )?
                        (?P<id>{playlist_id})
                     )rf  )r   rh  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   )rZ   r   r   r   r   r   r   r  r   r   r  r   r      r|  "PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlYDL_safe_search)rZ   r   r  zThis playlist is private)r   r;   r   r+  embeddedzQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEurp  JODA15"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEumilanz
@milan5503rf   z8https://www.youtube.com/channel/UCEI1-PVPcYXjB73Hfelbmaw20140919zUCEI1-PVPcYXjB73Hfelbmawz"https://www.youtube.com/@milan5503)rZ   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   r;   r  zPhttp://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIli  z'2018 Chinese New Singles (11/6 updated)"PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIlLBKz@music_kingz$md5:da521864744d60a198e3a88af4db0d9dz8https://www.youtube.com/channel/UC21nz3_MesPLqtDqwdvnoxAz#https://www.youtube.com/@music_kingUC21nz3_MesPLqtDqwdvnoxA)rZ   r   r   r   r   r   r   r   r  r   r   r  r   r  )r   rk  r;   r  TLGGrESM50VT6acwMjAyMjAxNwTrs  )OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMc                    sD   t |rdS ddlm} ||}|dd gd rdS t |S )NFr   )r   r~  )r   r   yt_dlp.utilsr   r&   r  )r  r   r   r  r  r0   r1   r   V	  s   
zYoutubePlaylistIE.suitablec                 C   sP   |  |}t|}tdt|pd|i}|rt|ddi}| j|t |dS )Nz https://www.youtube.com/playlistrA  r!   Tr   )	r   r   r!   r   r   r   r   r   r   )r:   r   r   r!   r0   r0   r1   r  `	  s   

zYoutubePlaylistIE._real_extract)ra  rb  rc  r  r  r   _PLAYLIST_ID_REr  r  r   r  r!  r"  r#  r   r  r%  r0   r0   r  r1   r     s    

N	r   )&r?   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   r0   r0   r0   r1   <module>   s:    X       R          