U
    y^MH                    @   s~  d dl mZ d dlZd dlZ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 ddlmZmZmZmZmZmZmZmZ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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 G d
d deZ6G dd de6Z7G dd de7Z8G dd de7Z9G dd de6Z:G dd de8Z;G dd de8Z<G dd de<Z=G dd de6Z>G dd de9Z?G dd de8Z@G d d! d!ee@ZAG d"d# d#eAZBG d$d% d%e@ZCG d&d' d'e9ZDG d(d) d)e6ZEG d*d+ d+e;ZFG d,d- d-e6ZGG d.d/ d/eEZHG d0d1 d1eEZIG d2d3 d3eEZJG d4d5 d5eZKG d6d7 d7eZLdS )8    )unicode_literalsN   )InfoExtractorSearchInfoExtractor   )JSInterpreter)SWFInterpreter)

compat_chrcompat_HTTPErrorcompat_kwargscompat_parse_qscompat_urllib_parse_unquote compat_urllib_parse_unquote_pluscompat_urllib_parse_urlencodecompat_urllib_parse_urlparsecompat_urlparse
compat_str)bool_or_none
clean_htmlerror_to_compat_strextract_attributesExtractorErrorfloat_or_noneget_element_by_attributeget_element_by_idint_or_nonemimetype2ext
orderedSetparse_codecsparse_durationremove_quotesremove_startsmuggle_urlstr_or_none
str_to_inttry_getunescapeHTMLunified_strdateunsmuggle_urluppercase_escapeurl_or_noneurlencode_postdatac                       s`   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
d Zdd Zdd Z fddZdd Z  ZS )YoutubeBaseInfoExtractorz-Provide base functions for Youtube extractorsz(https://accounts.google.com/ServiceLoginz,https://accounts.google.com/signin/challengez.https://accounts.google.com/_/signin/sl/lookupz1https://accounts.google.com/_/signin/sl/challengez;https://accounts.google.com/_/signin/challenge?hl=en&TL={0}youtubeFz9(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}c                 C   s   | j dddt d d d S )Nz.youtube.comZPREFzf1=50000000&hl=eni O )expire_time)_set_cookietimeself r3   OC:\Users\TaGoRe\Desktop\beinconnect-dl\binaries\youtube_dl\extractor\youtube.py_set_languageI   s      
z&YoutubeBaseInfoExtractor._set_languagec                    s    fdd|D S )Nc                    s   g | ]} j |d |dqS )Youtubevideo_id
url_result).0Zvid_idr1   r3   r4   
<listcomp>P   s   z<YoutubeBaseInfoExtractor._ids_to_results.<locals>.<listcomp>r3   )r2   idsr3   r1   r4   _ids_to_resultsO   s    
z(YoutubeBaseInfoExtractor._ids_to_resultsc                    s    \}}|dkrBjr>jjddkr>tdj dddS jjddddd	}|dkrddS 	|  fd
d}fdd}|dg dddddddddddddddg dgdddg gddddg	|g}|j
|dd}|dkrdS t|dd t}|s
|d dS |ddddddd|ddggddddddddg dgdddg gddddg	g}	|j|	dd}
|
dkrpdS t|
dd t}|rt|dd t}||dkrdd n| dS t|
dd t}|s|d  dS t|d!d t}|rJt|d"d t}|d#krt|d$d t}|d%kr,|d& dS t|
d'd t}|sN|d( dS d)}|sj|d* dS t|d+}|dddd,dddddddd|ddgg	g}|j||d-d.}|dkrdS t|d/d t}|rt|d0d t}||dkrd1d2 n| dS t|d3d t}n2d4d5d6d7}||d8j|f }|d9|  dS nt|d:d t}|sl|d; dS j|dd<dd=}|dkrdS d>|kr|d dS dS )?z
        Attempt to log in to YouTube.
        True is returned if successful or skipped.
        False is returned if login failed.

        If _LOGIN_REQUIRED is set and no authentication was provided, an error is raised.
        N
cookiefilez-No login info available, needed for using %s.TexpectedzDownloading login pagezunable to fetch login pageF)noteerrnotefatalc                    sT      }|dddddt|dddd	 j| d ||d	d
 dt|ddddS )Nr   r-   enzN[null,null,null,[],null,"US",null,null,[],"GlifWebSignIn",null,[null,null,[]]]ZGlifWebSignInZServiceLoginz["identifier",""])	ZpstMsgZcheckConnectionZcheckedDomainsZhlZ
deviceinfozf.reqZflowNameZ	flowEntryZ	bgRequestc                 S   s   t dd| S )Nz^[^[]* )resubsr3   r3   r4   <lambda>|       z>YoutubeBaseInfoExtractor._login.<locals>.req.<locals>.<lambda>Fz/application/x-www-form-urlencoded;charset=utf-8)zContent-TypezGoogle-Accounts-XSRF)rB   rC   transform_sourcerD   dataheaders)copyupdatejsondumps_download_jsonr+   )urlZf_reqrB   rC   rN   Z
login_formr2   r3   r4   reql   s0       z,YoutubeBaseInfoExtractor._login.<locals>.reqc                    s    j |  d S N)_downloaderreport_warning)messager1   r3   r4   warn   s    z-YoutubeBaseInfoExtractor._login.<locals>.warnUSr   r   a  https://accounts.google.com/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Fnext%3D%252F%26action_handle_signin%3Dtrue%26hl%3Den%26app%3Ddesktop%26feature%3Dsign_in_button&hl=en&service=youtube&uilel=3&requestPath=%2FServiceLogin&Page=PasswordSeparationSignIn   zLooking up account infozUnable to look up account infoc                 S   s   | d d S )Nr   r   r3   xr3   r3   r4   rK      rL   z1YoutubeBaseInfoExtractor._login.<locals>.<lambda>zUnable to extract user hashz
Logging inzUnable to log inc                 S   s   | d d S Nr      r3   r_   r3   r3   r4   rK      rL   c                 S   s   | d S Nrb   r3   r_   r3   r3   r4   rK      rL   ZINCORRECT_ANSWER_ENTEREDzUnable to login: %szInvalid passwordc                 S   s   | d d S )Nr   r3   r_   r3   r3   r4   rK      rL   zUnable to extract result entryc                 S   s   | d d S Nr   r3   r_   r3   r3   r4   rK      rL   c                 S   s   | d S Nr   r3   r_   r3   r3   r4   rK      rL   ZTWO_STEP_VERIFICATIONc                 S   s   | d S rc   r3   r_   r3   r3   r4   rK      rL   ZQUOTA_EXCEEDEDz*Exceeded the limit of TFA codes, try laterc                 S   s   | d d S )Nr   r   r3   r_   r3   r3   r4   rK      rL   zUnable to extract TLz2-step verification codezTwo-factor authentication required. Provide it either interactively or with --twofactor <code>(Note that only TOTP (Google Authenticator App) codes work at this time.)zG-	   zSubmitting TFA codezUnable to submit TFA codec                 S   s   | d d S ra   r3   r_   r3   r3   r4   rK      rL   c                 S   s   | d S rc   r3   r_   r3   r3   r4   rK      rL   zUnable to finish TFA: %szInvalid TFA codec                 S   s   | d d d S )Nr   rd   r   r3   r_   r3   r3   r4   rK      rL   z[This device isn't recognized. For your security, Google wants to make sure it's really you.zEPlease provide additional information to aid in the recovery process.zmThere is something unusual about your activity. For your security, Google wants to make sure it's really you.)ZLOGIN_CHALLENGEZUSERNAME_RECOVERYZREAUTHz%s returned error %s.zC%s
Go to https://accounts.google.com/, login and solve a challenge.c                 S   s   | d S rf   r3   r_   r3   r3   r4   rK      rL   z!Unable to extract CheckCookie URLzChecking cookierD   zhttps://myaccount.google.com/)_get_login_info_LOGIN_REQUIREDrY   paramsgetr   IE_NAME_download_webpage
_LOGIN_URL_hidden_inputs_LOOKUP_URLr%   r   _CHALLENGE_URLlist_get_tfa_infor!   _TFA_URLformat)r2   usernamepasswordZ
login_pagerW   r\   Z
lookup_reqZlookup_resultsZ	user_hashZchallenge_reqZchallenge_resultsZ	login_resZ	login_msgresZlogin_challengeZchallenge_strstatustlZtfa_codeZtfa_reqZtfa_resultsZtfa_resZtfa_msgZcheck_cookie_urlZ
CHALLENGES	challengeZcheck_cookie_resultsr3   rV   r4   _loginT   s^     
                              




          

  
     

zYoutubeBaseInfoExtractor._loginc                    s6   | di  }d|d< ||d< tt| j|t|S )NquerytrueZdisable_polymer)rl   rP   superr,   _download_webpage_handler   )r2   argskwargsr~   	__class__r3   r4   r     s    
 z1YoutubeBaseInfoExtractor._download_webpage_handlec                 C   s&   | j d krd S |   |  s"d S d S rX   )rY   r5   r}   r1   r3   r3   r4   _real_initialize  s
    
z)YoutubeBaseInfoExtractor._real_initialize)__name__
__module____qualname____doc__ro   Z_TWOFACTOR_URLrq   rr   ru   _NETRC_MACHINErj   _PLAYLIST_ID_REr5   r>   r}   r   r   __classcell__r3   r3   r   r4   r,   :   s    8r,   c                   @   s   e Zd Zdd ZdS )!YoutubeEntryListBaseInfoExtractorc                 c   s  | }}t dD ]}| |D ]
}|V  q td|}|s@ qd}d}	||	krz8| jd|d |d||rtd| nd	f td
}
W qW qH tk
r } z6t	|j
tr|j
jdkr|d7 }||	krW Y qH W 5 d }~X Y qHX qH|
d }| s q|
d }qd S )Nr   +data-uix-load-more-href="/?(?P<more>[^"]+)"r      https://youtube.com/%smorezDownloading page #%s%sz (retry #%d)rF   rM   )i  i  content_htmlload_more_widget_html)	itertoolscount_process_pagerG   searchrT   groupr)   r   
isinstancecauser
   codestrip)r2   pageplaylist_idmore_widget_htmlr   page_numentrymobjr   retriesr   er3   r3   r4   _entries  s<     z*YoutubeEntryListBaseInfoExtractor._entriesN)r   r   r   r   r3   r3   r3   r4   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS ) YoutubePlaylistBaseInfoExtractorc                 c   s*   |  |D ]\}}| |d||V  q
d S )Nr6   )extract_videos_from_pager:   )r2   contentr8   video_titler3   r3   r4   r   B  s    z.YoutubePlaylistBaseInfoExtractor._process_pagec           	   	   C   s   t ||D ]}d| kr,|ddkr,q|d}d| krPt|dnd }|r`| }|dkrld }z"||}|r|| s|||< W q tk
r   || || Y qX qd S )Nindexid0titleu   ► Play all)	rG   finditer	groupdictr   r&   r   r   
ValueErrorappend)	r2   Zvideo_rer   ids_in_pagetitles_in_pager   r8   r   idxr3   r3   r4   extract_videos_from_page_implF  s*    



z>YoutubePlaylistBaseInfoExtractor.extract_videos_from_page_implc                 C   s$   g }g }|  | j||| t||S rX   )r   	_VIDEO_REzip)r2   r   r   r   r3   r3   r4   r   Z  s       z9YoutubePlaylistBaseInfoExtractor.extract_videos_from_pageN)r   r   r   r   r   r   r3   r3   r3   r4   r   A  s   r   c                   @   s   e Zd Zdd Zdd ZdS )!YoutubePlaylistsBaseInfoExtractorc                 c   s,   t td|D ]}| d| dV  qd S )Nzb<h3[^>]+class="[^"]*yt-lockup-title[^"]*"[^>]*><a[^>]+href="/?playlist\?list=([0-9A-Za-z-_]{10,})"(https://www.youtube.com/playlist?list=%sYoutubePlaylist)r   rG   findallr:   )r2   r   r   r3   r3   r4   r   c  s    
 z/YoutubePlaylistsBaseInfoExtractor._process_pagec                 C   s:   |  |}| ||}| j|dd}| | ||||S NFrh   )	_match_idrn   _og_search_titleplaylist_resultr   )r2   rU   r   webpager   r3   r3   r4   _real_extractj  s    
z/YoutubePlaylistsBaseInfoExtractor._real_extractN)r   r   r   r   r   r3   r3   r3   r4   r   b  s   r   c                T       s  e Zd ZdZddeji ZdZddddd	d
dddddd	d
dddddddddddddddddddddddddddddddddddddddddd ddd!dd"d#dddddd$d%ddddd&ddd'dd(dd&ddd'dd(dd&ddd'dd(dd&d"d#d'dd(dddddddddddddddddd)dddd*d+ddd)dddd*d+ddd)dddd*d+dd#d)dddd*d+d&dd)d'dd(d*d+d&dd)d'dd(d*d+d&dd)d'dd(d*d+ddd,dd-dd.d+ddd,dd-dd.d+ddd,dddd.d+ddd,dddd.d+ddd,dd/dd.d+dd#d,dd/dd.d+ddd,dd-dd.d+dd0d,dddd.d+ddd1dd2ddd1dd2ddd1dd2ddd1dd2dd#d1dd2dd1dd3ddd1dd2ddd1dd2dd4d1dd2ddd1dd5d6dd#d1dd5d6dd7d1dd2d8d9dd-d:d;d8d9ddd:d;d8d9dd/d:d;d8d9dd:d<d8d9dd:d<d8d9d=d:d<d8d9d>d:d<d&ddd1d&d(d?d&ddd1d&d(d?d&ddd1d&d(d?d&d#d"d1d&d(d?d&ddd1d&d(d?d&ddd1d&d(d?d&dd1d&d@dAd&dd1d@d2d&dd1d@d2d&dd1d@d2d&dd1d@d2d&dd1d@d2d&dd1d@d2d&d#d1d@d2d&d4d1d@d2d&d7d1d@d2d&dd1d@d5d6d&d#d1d@d5d6d&d4d1d@d5d6d&d7d1d@d2d&d7d1d@d5d6d&d'd9ddBd&d'd9d/dBd&d9dCdDdEd&d9dCdFdEd&d9dCdGdEdHdIidJdKdLdJdKdLdJdKdLdJdKdLdMRZdNZ	dOZ
dPZdQdRddSdTdUdVdWdXdYdZd[gd\gd]eeed^d_d`dadbdcddddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzgd{d|d}d~d|dgd|dddddddddddddddddddddddddddddddd	ddddRddSdTdUdVdYdZd[gd\gd]eeedddiddddd8dYdddddddddddddd8dddddddddddddd8ddddddddddddddddddddddĜ	daddddddddddddΜ
daddddddddddddΜ
daddddddddddddddgdddddddddddd	ddiddddddddddddd
daddd&ddddddddiddd dd&ddddddddd	
d
ddddddddddddddddddddddddddddd d!d"d#d$
idd%dd&dd'dd d!d"d#d$
idd(dd)dd'dd d!d"d#d$
idd*dd+dd,dd d!d"d#d$
igddid-d.d/d0d1d2d3d4d5d6dd7d8dd7d9d:dd;d<d=d>d?d@dAd@dBd<dBdCdDddiddEdd7dFdGddHdIdJdKdLdddidMddNdOddPdQdRdSdTdUdVdWdX
ddiddYdZdd[d\d]d?d^d_d`dWd$
ddiddadd7dbdd7dcddddedfdgdhdidjd#dk	ddid-ddldmddndodpdqdrdrdsdtd^d^duddidvgdwdxdyddzd{d|d}d~ddd	ddidddd7ddd7ddd7ddd7ddd7dddddddddddd
ddOdd
dddddddddddddddddidddddddddddddddddidddddddddddddddddidddddddddddddddddidddd7g*Z f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ddӐdԄZdՐdք Zdאd؄ Zdِdڄ Zdېd܄ Zedݐdބ Zedߐd Ze dd Z!edd Z"dd Z#  Z$S (  	YoutubeIEzYouTube.coma   (?x)^
                     (
                         (?:https?://|//)                                    # http(s):// or protocol-independent URL
                         (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie|kids)?\.com/|
                            (?:www\.)?deturl\.com/www\.youtube\.com/|
                            (?:www\.)?pwnyoutube\.com/|
                            (?:www\.)?hooktube\.com/|
                            (?:www\.)?yourepeat\.com/|
                            tube\.majestyc\.net/|
                            # Invidious instances taken from https://github.com/omarroth/invidious/wiki/Invidious-Instances
                            (?:(?:www|dev)\.)?invidio\.us/|
                            (?:(?:www|no)\.)?invidiou\.sh/|
                            (?:(?:www|fi|de)\.)?invidious\.snopyta\.org/|
                            (?:www\.)?invidious\.kabi\.tk/|
                            (?:www\.)?invidious\.13ad\.de/|
                            (?:www\.)?invidious\.mastodon\.host/|
                            (?:www\.)?invidious\.nixnet\.xyz/|
                            (?:www\.)?invidious\.drycat\.fr/|
                            (?:www\.)?tube\.poal\.co/|
                            (?:www\.)?vid\.wxzm\.sx/|
                            (?:www\.)?yt\.elukerio\.org/|
                            (?:www\.)?yt\.lelux\.fi/|
                            (?:www\.)?kgg2m7yk5aybusll\.onion/|
                            (?:www\.)?qklhadlycap4cnod\.onion/|
                            (?:www\.)?axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid\.onion/|
                            (?:www\.)?c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid\.onion/|
                            (?:www\.)?fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad\.onion/|
                            (?:www\.)?invidious\.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd\.onion/|
                            (?:www\.)?owxfohz4kjyv25fvlqilyxast7inivgiktls3th44jhk3ej3i7ya\.b32\.i2p/|
                            youtube\.googleapis\.com/)                        # the various hostnames, with wildcard subdomains
                         (?:.*?\#/)?                                          # handle anchor (#/) redirect urls
                         (?:                                                  # the various things that can precede the ID:
                             (?:(?:v|embed|e)/(?!videoseries))                # v/ or embed/ or e/
                             |(?:                                             # or the v= param in all its forms
                                 (?:(?:watch|movie)(?:_popup)?(?:\.php)?/?)?  # preceding watch(_popup|.php) or nothing (like /?v=xxxx)
                                 (?:\?|\#!?)                                  # the params delimiter ? or # or #!
                                 (?:.*?[&;])??                                # any other preceding param (like /?s=tuff&v=xxxx or ?s=tuff&amp;v=V36LpHqtcDY)
                                 v=
                             )
                         ))
                         |(?:
                            youtu\.be|                                        # just youtu.be/xxxx
                            vid\.plus|                                        # or vid.plus/xxxx
                            zwearz\.com/watch|                                # or zwearz.com/watch/xxxx
                         )/
                         |(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId=
                         )
                     )?                                                       # all until now is optional -> you can pass the naked ID
                     ([0-9A-Za-z_-]{11})                                      # here is it! the YouTube video ID
                     (?!.*?\blist=
                        (?:
                            %(playlist_id)s|                                  # combined list/video URLs are handled by the playlist IE
                            WL                                                # WL are handled by the watch later IE
                        )
                     )
                     (?(1).+)?                                                # if we found the ID, everything can follow
                     $r   z[\?&]next_url=([^&]+)flvi     mp3@   h263)extwidthheightacodecabrvcodeci  i  3gpaacmp4v)r   r   r            mp4i  ih  `   h264i   i        iV  i  @  )r   r   r   r   i  i8  i   i   webmvorbisvp8Z3Di)r   r   format_noter   r   r   
preferenceZHLS0   i   H   z
DASH video)r   r   r   r   )r   r   r   i  <   )r   r   r   r   fpsip  m4az
DASH audiom4a_dash)r   r   r   r   	container)r   r   r   r   dtsezec-3)r   r   r   r   r   r   vp9)r   r   r   r   r   )r   r   r   r   opus2   )r   r   r   r   F      protocolrtmpnonezav01.0.05M.08)r   r   )R56Z13Z17Z18Z22Z34Z35Z36Z37Z3843Z44Z45Z46Z59Z78Z82Z83Z84Z85Z100Z101Z102Z91Z92Z93Z94Z95Z96Z132Z151Z133Z134135Z136Z137Z138Z160Z212Z264Z298Z299Z266Z139Z140141Z256Z258Z325Z328Z167Z168Z169Z170Z218Z219Z278Z242Z243Z244Z245Z246Z247Z248Z271Z272Z302Z303Z308Z313Z315Z171Z172Z249Z250Z251_rtmpZ394Z395Z396Z397)Zsrv1Zsrv2Zsrv3ttmlvttFr-   z6https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9ZBaW_jenozKcu#   youtube-dl test video "'/\ä↭𝕐zPhilipp HagemeisterZphihagz.re:https?://(?:www\.)?youtube\.com/user/phihagZUCLqxVugv74EIW3VWh2NOa3QzCre:https?://(?:www\.)?youtube\.com/channel/UCLqxVugv74EIW3VWh2NOa3QZ20121002u   test chars:  "'/\ä↭𝕐
test URL: https://github.com/rg3/youtube-dl/issues/1892

This is a test video for youtube-dl.

For more information, contact phihag@phihag.de .zScience & Technologyz
youtube-dl
   r   rg   )r   r   r   uploaderuploader_iduploader_url
channel_idchannel_urlupload_datedescription
categoriestagsduration
view_count
like_countdislike_count
start_timeend_time)rU   	info_dictz+https://www.youtube.com/watch?v=UxxajLWwzqYz.Test generic use_cipher_signature video (#897)ZUxxajLWwzqYZ20120506z9Icona Pop - I Love It (feat. Charli XCX) [OFFICIAL VIDEO]zI Love It (feat. Charli XCX)z$md5:19a2f98d9032b9311e686ed039564f63zIcona Pop i love itZswedenz	pop musiczbig beat recordszbig beatZcharliZxcxz
charli xcxZgirlshboz	i love itzi don't careZiconapopz	iconic epZiconicZloveit   z	Icona PopZIconaPopz0re:https?://(?:www\.)?youtube\.com/user/IconaPop)r   r   r   r   	alt_titler  r  r  r   r   r   creatortrackartist)rU   rB   r
  z+https://www.youtube.com/watch?v=07FYdnEawAQz*Test VEVO video with age protection (#956)Z07FYdnEawAQZ20130703zCJustin Timberlake - Tunnel Vision (Official Music Video) (Explicit)zTunnel Visionz$md5:07dab3356cde4199048e4c7cd93471e1i  ZjustintimberlakeVEVOz<re:https?://(?:www\.)?youtube\.com/user/justintimberlakeVEVOzJustin Timberlake   )r   r   r   r   r  r  r  r   r   r   r  r  r  	age_limitz%//www.YouTube.com/watch?v=yZIXLfi8CZQzEmbed-only video (#1746)ZyZIXLfi8CZQZ20120608zCPrincipal Sexually Assaults A Teacher - Episode 117 - 8th June 2012z$md5:09b78bd971f1e3e289601dfba15ca4f7z	SET IndiaZsetindiaz0re:https?://(?:www\.)?youtube\.com/user/setindia)	r   r   r   r   r  r   r   r   r  z9https://www.youtube.com/watch?v=BaW_jenozKc&v=UxxajLWwzqYz!Use the first video ID in the URL)r   r   r   r   r   r   r   r  r  r  r  r  r  r  skip_downloadT)rU   rB   r
  rk   z+https://www.youtube.com/watch?v=a9LDPn-MO4Iz.256k DASH audio (format 141) via DASH manifestza9LDPn-MO4IZ8KVIDEOz/re:https?://(?:www\.)?youtube\.com/user/8KVIDEOrF   zUHDTV TEST 8K VIDEO.mp4)r   r   r   r   r   r  r   r   r   )youtube_include_dash_manifestrv   zformat 141 not served anymore)rU   rB   r
  rk   skipz+https://www.youtube.com/watch?v=IB3lcPjvWLAZIB3lcPjvWLAzJAfrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree Wilsonz$md5:8f5e2b82460520b619ccac1f509d43bf   ZAfrojackVEVOZ20131011)r   r   r   r  r  r   r   r   z141/bestaudio[ext=m4a]rU   r
  rk   z+https://www.youtube.com/watch?v=nfWlot6h_JMZnfWlot6h_JMzTaylor Swift - Shake It Offz$md5:307195cd21ff7fa352270fe884570ef0   ZTaylorSwiftVEVOZ20140818z+https://www.youtube.com/watch?v=T4XJQO3qol8ZT4XJQO3qol8   Z20100909zAmazing AtheistZTheAmazingAtheistz9re:https?://(?:www\.)?youtube\.com/user/TheAmazingAtheistzBurning Everyone's KoranzSUBSCRIBE: http://www.youtube.com/saturninefilms

Even Obama has taken a stand against freedom on this issue: http://www.huffingtonpost.com/2010/09/09/obama-gma-interview-quran_n_710282.html)	r   r   r  r   r   r   r   r   r  z'https://youtube.com/watch?v=HtVdAasjOgUZHtVdAasjOgUz7The Witcher 3: Wild Hunt - The Sword Of Destiny Trailerz@re:(?s).{100,}About the Game\n.*?The Witcher 3: Wild Hunt.{100,}   zThe WitcherZWitcherGamez3re:https?://(?:www\.)?youtube\.com/user/WitcherGameZ20140605)
r   r   r   r  r  r   r   r   r   r  z+https://www.youtube.com/watch?v=6kLq3WMV1nUZ6kLq3WMV1nUz-Dedication To My Ex (Miss That) (Lyric Video)z$md5:33765bb339e1b47e7e72b5490139bb41   Z	LloydVEVOz1re:https?://(?:www\.)?youtube\.com/user/LloydVEVOZ20110629Z__2ABJjxzNoi
  Z20100430Zdeadmau5z0re:https?://(?:www\.)?youtube\.com/user/deadmau5zDada Life, deadmau5z$md5:12c56784b8032162bb936a5f76d55360zDeadmau5 - Some Chords (HD)zThis Machine Kills Some Chords)r   r   r  r   r   r   r  r  r   r   r  zDASH manifest missing)rU   r
  expected_warningsZlqQg6PlCWgIi  Z20150827Zolympicz/re:https?://(?:www\.)?youtube\.com/user/olympiczLHO09  - Women -  GER-AUS - Hockey - 31 July 2012 - London 2012 Olympic GamesZOlympicz5Hockey - Women -  GER-AUS - London 2012 Olympic Games)	r   r   r  r   r   r   r  r   r   zrequires avconvz+https://www.youtube.com/watch?v=_b-2C3KPAM0z_b-2C3KPAM0gqq?U   Z20110310Z	AllenMeowz1re:https?://(?:www\.)?youtube\.com/user/AllenMeowuu   made by Wacom from Korea | 字幕&加油添醋 by TY's Allen | 感謝heylisa00cavey1001同學熱情提供梗及翻譯u	   孫ᄋᄅu8   [A-made] 變態妍字幕版 太妍 我就是這樣的人)
r   r   stretched_ratior  r   r   r   r  r   r   ZqEJwOuvDf7Iu   Обсуждение судебной практики по выборам 14 сентября 2014 года в Санкт-ПетербургеZ20150404Zspbelectu+   Наблюдатели Петербурга)r   r   r   r  r   r   r   zThis live event has ended.)rU   r
  rk   r  z+https://www.youtube.com/watch?v=FIl7x6_3R5YZFIl7x6_3R5Yz$md5:7b81415841e02ecd4313668cde88737az$md5:116377fd2963b81ec4ce64b542173306   Z20150625Zdorappi2000z3re:https?://(?:www\.)?youtube\.com/user/dorappi2000zmincount:31)
r   r   r   r  r  r   r   r   r   formatsznot actual anymore)rU   r
  r  z)https://www.youtube.com/embed/CsmdDsKjzN8Z 8ce563a1d667b599d21064e982ab9e31ZCsmdDsKjzN8Z20150501ZAirtekuA   Retransmisión en directo de la XVIII media maratón de Zaragoza.ZUCzTzUmjXxxacNnL8I3m4LnQu1   Retransmisión XVIII Media maratón Zaragoza 2015)r   r   r   r   r  r   r   r   )rU   md5r
  rk   r  z+https://www.youtube.com/watch?v=jqWvoWXjCVsZjqWvoWXjCVsz"teamPGP: Rocket League Noob Streamz$md5:dc7872fb300e143831327f1bae3af010)r   r   r  r
  z0teamPGP: Rocket League Noob Stream (Main Camera)i  Z20150721zBeer Games BeerZbeergamesbeerz5re:https?://(?:www\.)?youtube\.com/user/beergamesbeerStandard YouTube License)
r   r   r   r  r  r   r   r   r   licenseZ6h8e8xoXJzgz-teamPGP: Rocket League Noob Stream (kreestuh)i  ZPUOgX5z9xZwz,teamPGP: Rocket League Noob Stream (grizzle)ZteuwxikvS5kz(teamPGP: Rocket League Noob Stream (zim)i  This video is not available.)rU   r
  playlistrk   r  z+https://www.youtube.com/watch?v=gVfLd0zydloZgVfLd0zydloz/DevConf.cz 2016 Day 2 Workshops 1 14:00 - 15:30r   r   r   zNot multifeed anymorerU   r
  playlist_countr  zhttps://vid.plus/FlRa-iH7PGwrU   only_matchingz_https://zwearz.com/watch/9lWxNJF-ufM/electra-woman-dyna-girl-official-trailer-grace-helbig.htmlz+https://www.youtube.com/watch?v=lsguqyKfVQgZlsguqyKfVQgz4{dark walk}; Loki/AC/Dishonored; collab w/Elflover21zDark Walk - Position Musicz$md5:8085699c11dc3f597ce0410b0dcbb34a   Z20151119ZIronSoulElfz3re:https?://(?:www\.)?youtube\.com/user/IronSoulElfz1Todd Haberman,  Daniel Law Heath and Aaron Kaplanz6Position Music - Production Music Vol. 143 - Dark Walk)r   r   r   r  r  r  r   r   r   r   r  r  r  albumz+https://www.youtube.com/watch?v=Ms7iBXnlUO8z+https://www.youtube.com/watch?v=Q39EVAstoRMZQ39EVAstoRMz+Clash Of Clans#14 Dicas De Ataque Para CV 4z$md5:ee18a25c350637c8faff806845bddee9Z20151107ZUCCr7TALkRbo3EtFzETQF1LAzCH GAMER DROIDzThis video does not exist.z+https://www.youtube.com/watch?v=M4gD1WSo5mAZM4gD1WSo5mAz$md5:e41008789470fc2533a3252216f1c1d1z$md5:a677553cf0840649b731a3024aeff4cci  Z20150127ZBerkmanCenterz5re:https?://(?:www\.)?youtube\.com/user/BerkmanCenterz/The Berkman Klein Center for Internet & Societyz4Creative Commons Attribution license (reuse allowed))
r   r   r   r  r  r   r   r   r   r%  z+https://www.youtube.com/watch?v=eQcmzGIKrzgZeQcmzGIKrzgz8Democratic Socialism and Foreign Policy | Bernie Sandersz$md5:dda0d780d5a6e120758d1711d062a867i  zBernie SandersZUCH1dpzjCEiGAt8CXkryhkZgzCre:https?://(?:www\.)?youtube\.com/channel/UCH1dpzjCEiGAt8CXkryhkZgzKhttps://www.youtube.com/watch?feature=player_embedded&amp;amp;v=V36LpHqtcDYz+https://www.youtube.com/watch?v=i1Ko8UG-Tdoz+https://www.youtube.com/watch?v=yYr8q0y5JfgZuGpuVWrhIzEzPiku - Trailerz$md5:c36bd60c3fd6f1954086c083c72092ebZ20150811Z
FlixMatrixZFlixMatrixKaravanz9re:https?://(?:www\.)?youtube\.com/user/FlixMatrixKaravan)	r   r   r   r  r   r   r   r   r%  z+https://www.youtube.com/watch?v=iqKdEhx-dD4ziqKdEhx-dD4zIsolation - Mind Field (Ep 1)z$md5:46a29be4ceffa65b92d277b93f463c0fi%  Z20170118ZVsaucez.re:https?://(?:www\.)?youtube\.com/user/Vsaucez
Mind Field)r   r   r   r  r  r   r   r   r   seriesseason_numberepisode_numberzSkipping DASH manifest)rU   r
  rk   r  z+https://www.youtube.com/watch?v=6SJNVb0GnPIZ6SJNVb0GnPIz Race Differences in Intelligencez$md5:5d161533167390427a1f8ee89a1fc6f1i  Z20140124zNew Century FoundationZUCEJYpZGqgUob0zVVEaLhvVgzCre:https?://(?:www\.)?youtube\.com/channel/UCEJYpZGqgUob0zVVEaLhvVg)	r   r   r   r  r  r   r   r   r   Z1t24XAntNCYzsJL6WA-aGkQz5https://www.youtube.com/watch?v=MuAGGZNfUkU&list=RDMMz&https://invidio.us/watch?v=BaW_jenozKcz+https://www.youtube.com/watch?v=s7_qI6_mIXcz+https://www.youtube.com/watch?v=Z4Vy8R84T1UZZ4Vy8R84T1UzCsaman SMAN 53 Jakarta(Sancety) opening COFFEE4th at SMAN 53 Jakartaz$md5:d41d8cd98f00b204e9800998ecf8427ei  Z20130923zAmelia Putri HarwitaZUCpOxM49HJxmC1qCalXyB3_QzCre:https?://(?:www\.)?youtube\.com/channel/UCpOxM49HJxmC1qCalXyB3_Qzmaxcount:10)
r   r   r   r  r  r   r   r   r   r"  )r  r  z-https://music.youtube.com/watch?v=MgNrAu2pzNsZMgNrAu2pzNszVoyeur Girlz$md5:7ae382a65843d6df2685993e90a8628fZ20190312zStephen - TopiczUC-pWHpBjdGG69N9mM2auIAAZStephenz"it's too much love to know my dearZ20190313i  )r   r   r   r  r   r   r   r  r  r.  release_daterelease_yearz+https://www.youtube.com/watch?v=k0jLE7tTwjYZk0jLE7tTwjYzLatch Feat. Sam Smithz$md5:3cb1e8101a7c85fcba9b4fb41b951335Z20150110zVarious Artists - TopicZUCNkEcmYdjrH4RqtNgh7BZ9wZ
DisclosurezLatch Featuring Sam SmithZ20121008i  z+https://www.youtube.com/watch?v=74qn0eJSjpAZ74qn0eJSjpAZEastsidez$md5:290516bb73dcbfab0dcc4efe6c3de5f2Z20180710zBenny Blanco - TopicZUCzqz_ksRu_WkIzmivMdIS7Azbenny blanco, Halsey, KhalidZ20180713i  z+https://www.youtube.com/watch?v=-hcAI0g-f5Mz-hcAI0g-f5MzPut It On Mez$md5:f6422397c07c4c907c6638e1fee380a5Z20180426zMatt Maeson - TopiczUCnEkIGqtGcQMLk73Kp-Q5LQzMatt Maesonz
The HearseNz/https://www.youtubekids.com/watch?v=3b8nCWDgZ6Qc                    s   t t| j|| i | _d S rX   )r   r   __init___player_cache)r2   r   r   r   r3   r4   r4    s    zYoutubeIE.__init__c                 C   s   |  d|  dS )z.Report attempt to download video info webpage.z"%s: Downloading video info webpageN	to_screenr2   r8   r3   r3   r4   "report_video_info_webpage_download  s    z,YoutubeIE.report_video_info_webpage_downloadc                 C   s   |  d|  dS )z,Report attempt to extract video information.z %s: Extracting video informationNr6  r8  r3   r3   r4   report_information_extraction  s    z'YoutubeIE.report_information_extractionc                 C   s   |  d||f  dS )zReport extracted video URL.z%s: Format %s not availableNr6  )r2   r8   rv   r3   r3   r4   report_unavailable_format  s    z#YoutubeIE.report_unavailable_formatc                 C   s   |  d dS )z1Indicate the download will use the RTMP protocol.zRTMP download detectedNr6  r1   r3   r3   r4   report_rtmp_download  s    zYoutubeIE.report_rtmp_downloadc                 C   s   d dd |dD S )z/ Return a string representation of a signature .c                 s   s   | ]}t t|V  qd S rX   r   len)r;   partr3   r3   r4   	<genexpr>  s     z0YoutubeIE._signature_cache_id.<locals>.<genexpr>)joinsplit)r2   example_sigr3   r3   r4   _signature_cache_id  s    zYoutubeIE._signature_cache_idc                    sP  t d|}|std| |d}|d}d||| |f }tj||ksXt| j	j
d|  d k	r| fddS | j	jd	rd
| n
d||f }|dkr| j|||d| d}	| |	}
nD|dkr| j|||d| d}| }	| |	}
ndstd| dtttt|}|
|}dd |D  | j	j
d|  |
S )Nzs.*?[-.](?P<id>[a-zA-Z0-9_-]+)(?:/watch_as3|/html5player(?:-new)?|(?:/[a-z]{2,3}_[A-Z]{2})?/base)?\.(?P<ext>[a-z]+)$zCannot identify player %rr   r   z%s_%s_%szyoutube-sigfuncsc                    s   d  fddD S )NrF   c                 3   s   | ]} | V  qd S rX   r3   )r;   irI   r3   r4   rA    s     zJYoutubeIE._extract_signature_function.<locals>.<lambda>.<locals>.<genexpr>)rB  rI   
cache_specrI   r4   rK     rL   z7YoutubeIE._extract_signature_function.<locals>.<lambda>verbosezDownloading player %szDownloading %s player %sZjszDownload of %s failedrB   rC   swfFzInvalid player type %rrF   c                 S   s   g | ]}t |qS r3   ordr;   cr3   r3   r4   r<     s     z9YoutubeIE._extract_signature_function.<locals>.<listcomp>)rG   matchr   r   rE  ospathbasenameAssertionErrorrY   cacheloadrk   rl   rn   _parse_sig_js_request_webpageread_parse_sig_swfrB  mapr	   ranger?  store)r2   r8   
player_urlrD  Zid_mZplayer_type	player_idZfunc_idZdownload_noter   ry   urlhtest_string	cache_resr3   rG  r4   _extract_signature_function  sX    

  

  z%YoutubeIE._extract_signature_functionc           
      C   s   dd }d tttt|}||}dd |D }d ||}dd d	d
 |dD  }d||f }	| d|	  d S )Nc                 s   s   dd }d }d}t | dd  | d d D ]X\}}|d k	r\|| |krHq*||||V  d }q*|| dkrx|| }|}q*q*d| V  q*|d krd| V  n||||V  d S )Nc                 S   sR   | dkrdnt | }|| dkr,d||  nd}|dkr<dnd| }d|||f S )Nr   rF   z:%d:r   z	s[%s%s%s])str)startendstepZstartsZendsZstepsr3   r3   r4   	_genslice  s    zBYoutubeIE._print_sig_code.<locals>.gen_sig_code.<locals>._genslicez(Never used)r   rd   )rd   r   zs[%d])r   )Zidxsri  rh  rf  rF  prevr3   r3   r4   gen_sig_code  s$    "z/YoutubeIE._print_sig_code.<locals>.gen_sig_coderF   c                 S   s   g | ]}t |qS r3   rL  rN  r3   r3   r4   r<   5  s     z-YoutubeIE._print_sig_code.<locals>.<listcomp>z + z(%s), c                 s   s   | ]}t t|V  qd S rX   r>  )r;   pr3   r3   r4   rA  8  s     z,YoutubeIE._print_sig_code.<locals>.<genexpr>r=  z<if tuple(len(p) for p in s.split('.')) == %s:
    return %s
zExtracted signature function:
)rB  r[  r	   r\  r?  rC  r7  )
r2   funcrD  rk  ra  rb  rH  Z	expr_codeZsignature_id_tupler   r3   r3   r4   _print_sig_code  s    zYoutubeIE._print_sig_codec                    s0   | j d|ddd}t|}||  fddS )N)zX\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(zg\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(zW\b(?P<sig>[a-zA-Z0-9$]{2})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)zS(?P<sig>[a-zA-Z0-9$]+)\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)z1(["\'])signature\1\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(z!\.sig\|\|(?P<sig>[a-zA-Z0-9$]+)\(zyt\.akamaized\.net/\)\s*\|\|\s*.*?\s*[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?:encodeURIComponent\s*\()?\s*(?P<sig>[a-zA-Z0-9$]+)\(z>\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(zM\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(zH\bc\s*&&\s*a\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(S\bc\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(rp  z)Initial JS player signature function namesig)r   c                    s
    | gS rX   r3   rI   Zinitial_functionr3   r4   rK   P  rL   z)YoutubeIE._parse_sig_js.<locals>.<lambda>)_search_regexr   extract_function)r2   ZjscodefuncnameZjsir3   rr  r4   rW  =  s      
zYoutubeIE._parse_sig_jsc                    s.   t |}d}||}||d  fddS )NZSignatureDecipherZdecipherc                    s
    | gS rX   r3   rI   rr  r3   r4   rK   W  rL   z*YoutubeIE._parse_sig_swf.<locals>.<lambda>)r   Zextract_classrt  )r2   Zfile_contentsZswfiZTARGET_CLASSNAMEZsearched_classr3   rr  r4   rZ  R  s
    
zYoutubeIE._parse_sig_swfc           	   
   C   s   |dkrt d|dr$d| }ntd|s<td|}z^|| |f}|| jkrn| |||}|| j|< | j| }| j	j
dr| || ||W S  tk
r } zt }t d| |d	W 5 d}~X Y nX dS )
z3Turn the encrypted s field into a working signatureNz+Cannot decrypt signature without player_urlz//zhttps:z	https?://zhttps://www.youtube.comyoutube_print_sig_codezSignature extraction failed: )r   )r   
startswithrG   rP  r   urljoinrE  r5  rc  rY   rk   rl   ro  	Exception	traceback
format_exc)	r2   rJ   r8   r^  age_gater_  rn  r   tbr3   r3   r4   _decrypt_signatureY  s8    

 
  


 zYoutubeIE._decrypt_signaturec              
   C   s   z| j d| |dd}W n> tk
rV } z | jdt|  i  W Y S d }~X Y nX i }|dD ]b}|jd }||kr~qfg }| jD ]6}	t|||	|jd 	dd	}
|
d
|
 |	d q|||< qf|s| jd i S |S )Nz7https://video.google.com/timedtext?hl=en&type=list&v=%sF)rB   z&unable to download video subtitles: %sr  	lang_codenameutf-8)langvfmtr  z&https://www.youtube.com/api/timedtext?rU   r   zvideo doesn't have subtitles)_download_xmlr   rY   rZ   r   r   attrib_SUBTITLE_FORMATSr   encoder   )r2   r8   r   Zsubs_docerrsub_lang_listr  r  sub_formatsr   rk   r3   r3   r4   _get_subtitlest  s>     




zYoutubeIE._get_subtitlesc                 C   s2   d}| j ||dd d}|r.| jt||ddS d S )N)z(;ytplayer\.config\s*=\s*({.+?});ytplayerz ;ytplayer\.config\s*=\s*({.+?});zytplayer.configdefaultFrh   )rs  _parse_jsonr)   )r2   r8   r   patternsconfigr3   r3   r4   _get_ytplayer_config  s         zYoutubeIE._get_ytplayer_configc              
      sd    d|   ||}d| }|s6 j| i S z|d }|d}|r&|d }tdddd}|d	 | }	 |	|}
|
d
}|dkr jd i W S |jd }|jdd}i }|
	dD ]R}|jd }g } j
D ]0}t|||||d}||d	 | |d q|||< q|W S  fdd}|d}|rt|tr j||dd}|r|d d }|d d d }g }|d D ] }|d}|r|| q|||W S |d }|d  }t|d!d d" d }g }|d!D ]4}tt|}|d#dgd }|r|| q|||W S  tttfk
r^    j| i  Y S X dS )$zlWe need the webpage for getting the captions url, pass it as an
           argument to speed up the process.z"%s: Looking for automatic captionsz'Couldn't find automatic captions for %sr   Zttsurl	timestamprs   r   )typeZtlangsZasrs&r  Nz%Video doesn't have automatic captionsr  kindrF   target)r  tlangr  tsr  r  c                    sx   t | }t|j}i }|D ]X}g } jD ]@}||g|gd t|jt|dd} |	| |d q(|||< q|S )N)r  r  Tr~   r  )
r   r   r~   r  rQ   r   
urlunparse_replacer   r   )Zsub_url	sub_langsZparsed_sub_urlZ
caption_qscaptionssub_langr  r   r1   r3   r4   make_captions  s&    



z8YoutubeIE._get_automatic_captions.<locals>.make_captionsplayer_responseFrh   r  ZplayerCaptionsTracklistRendererZcaptionTracksr   baseUrlZtranslationLanguagesZlanguageCodecaption_trackscaption_translation_languages,ulc)r7  r  rY   rZ   rl   r   r  findr  r   r  r   r   r   r  r   rC  r   KeyError
IndexErrorr   )r2   r8   r   Zplayer_configerr_msgr   Zcaption_urlr  Zlist_paramsZlist_urlZcaption_listZoriginal_lang_nodeZoriginal_langZcaption_kindr  Z	lang_noder  r  r   rk   r  r  Zrendererbase_urlr  r  r  r  Zlang_qsr3   r1   r4   _get_automatic_captions  s    








  
z!YoutubeIE._get_automatic_captionsc                    s   t t|dd pt|dd }|s(d S t|}t|j}d d fddtdd	D }|d
g|gd t	|j
t|dd}| j||dddd d S )Nc                 S   s   | d d d S )NZplaybackTrackingZvideostatsPlaybackUrlr  r3   r_   r3   r3   r4   rK     rL   z)YoutubeIE._mark_watched.<locals>.<lambda>c                 S   s   | d d S )NZvideostats_playback_base_urlr   r3   r_   r3   r3   r4   rK     rL   z@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_rF   c                 3   s"   | ]} t d dd@  V  qdS )r   r   ?   N)randomrandint)r;   _ZCPN_ALPHABETr3   r4   rA    s     z*YoutubeIE._mark_watched.<locals>.<genexpr>r      2)vercpnTr  zMarking watchedzUnable to mark watchedFrh   )r*   r%   r   urlparseparse_qsr~   rB  r\  rQ   r  r  r   rn   )r2   r8   
video_infor  Zplayback_urlZparsed_playback_urlqsr  r3   r  r4   _mark_watched  s:     
   zYoutubeIE._mark_watchedc              	   C   sV   dd t d| D }|tttt d|  t d| }|dd |D  |S )Nc                 S   s   g | ]}t |d qS rU   r&   r   )r;   r   r3   r3   r4   r<   )  s   z+YoutubeIE._extract_urls.<locals>.<listcomp>a  (?x)
            (?:
                <iframe[^>]+?src=|
                data-video-url=|
                <embed[^>]+?src=|
                embedSWF\(?:\s*|
                <object[^>]+data=|
                new\s+SWFObject\(
            )
            (["\'])
                (?P<url>(?:https?:)?//(?:www\.)?youtube(?:-nocookie)?\.com/
                (?:embed|v|p)/[0-9A-Za-z_-]{11}.*?)
            \1z(class="lazyYT" data-youtube-id="([^"]+)"z(?x)<div[^>]+
            class=(?P<q1>[\'"])[^\'"]*\byvii_single_video_player\b[^\'"]*(?P=q1)[^>]+
            data-video_id=(?P<q2>[\'"])([^\'"]+)(?P=q2)c                 s   s   | ]}|d  V  qdS )rd   Nr3   r;   mr3   r3   r4   rA  B  s     z*YoutubeIE._extract_urls.<locals>.<genexpr>)rG   r   extendrs   r[  r&   r   )r   entriesmatchesr3   r3   r4   _extract_urls&  s    
zYoutubeIE._extract_urlsc                 C   s   t | }|r|d S d S re   )r   r  )r   urlsr3   r3   r4   _extract_urlF  s    
zYoutubeIE._extract_urlc                 C   s4   t | j|t j}|d kr&td| |d}|S )NInvalid URL: %sr   )rG   rP  
_VALID_URLVERBOSEr   r   )clsrU   r   r8   r3   r3   r4   
extract_idK  s
    
zYoutubeIE.extract_idc           
      C   s   | sd S t d| }|sd S g }t|ddD ]\}\}}t|}|d krJq,||krV q|t|krf|nt|| d }|d krq,||kr|}||kr qt dd|d}	t dd|	}	||||	d	 q,|S )
Nz(?:^|<br\s*/>)([^<]*<a[^>]+onclick=["\']yt\.www\.watch\.player\.seekTo[^>]+>(\d{1,2}:\d{1,2}(?::\d{1,2})?)</a>[^>]*)(?=$|<br\s*/>)r   )rf  z<a[^>]+>[^<]+</a>rF   z 	-z\s+ )r  r	  r   )rG   r   	enumerater   r?  rH   r   r   )
r  r  Zchapter_lineschaptersZnext_numZchapter_lineZ
time_pointr  r	  chapter_titler3   r3   r4   _extract_chaptersS  sR       
zYoutubeIE._extract_chaptersc              '      s  t i \}jjddr"dnd}d }d }t}|j|jfD ]l}t|}|d krnd|krnt|d d }|d krd|krt|d d }|d krBd|krBt|d d }qBt	
j}	|	r|d	 t|	d
d |d  t	
d}	|	d k	r,t	dd|	d
nd g fdd}
fdd d }d }dd } fdd}i }i }d }t	
dd k	rBd|d  d}td jd|ddd d!}|d" | }zj|d#d$d%}W n tk
r   d }Y nX |rt|}|d&d gd }||}|
| ||}nd}|r|d' }|d(sx|d)rtd*d+ | D }|
| |s|d,rĈj|d, t |d, d-S |d.d/ks|d0d
krd}|s||d&}|rjjd1dr | fd2d3}|sZ|sZ| }|sHd4}td5| dd6t|tsji }t|d7d8 tp~i }|d9d gd p|d9}|sjd: d;}td< }}|rfd=d>}t	d?|| }}t|}n d@p|dA}|dBdsjjdCst|dDd8 t!pFt|dEd8 t!}|rg } g }!|"dFD ]b}"tt#|"}#| $dGdHt%dI||#dJ d f dBdidK||#d9 d f dL |!$|#dJ d  q`&dMdN'|!f  (| ||S n&dO  |d kr||}|d kr,|r,t)|dP}|d krDt*|dQ}dR|krddS|krdtdTddUfdVdW}$t|dXd8 t+pg }%|%,t|dYd8 t+pg  dZ|kr|dZ d -d[r.  d\d[|dZ d d]g}&n|s|%s(t/|d(dgd d
ks(t/|d^dgd d
kr|d(dgd dF |d^dgd  }'d_|'krftd`ddUg }&i }(|dadgd })|)r|)"dFD ]b}*|*"d}+t/|+d
kr|+d
 "db},t/|,dckr|+d
 t)|,d t)|,d
 dd|(|+d < q|%D ]}*t0|*de}-|-sq|*df}.|*dgp,|.}/t)|*dht)|*di|/t)|*djt)|*dk|-dlkrt1|*dmp|*dndond t)|*dpdq|(|-< q|%D ]
}*|*drrqt2|*dss|*dt}0|0sqt|0}1t2t|1dud8 t!sqnd }0ttj}1t)t|1dvd8 }2|2dwkr>q|*depT|1de d }3|3s`qt!|3}3|0
rdx|1ksjjd1d	rdy}4j|4r|ndzd d }5|5ss|d kr|d  }6|6d}|4|d{}5t34|5d k	rd|d}}7t34|7d~|1k	r4d|1d~ d  7 ndx|1k
r|1dx d }8jjd	r҈d k	rnd}9d}:nF5d	rjdddd}9d|9 }:njddgddd}9d|9 }:6|8};&d|3|;|:f  7|8}<t|1dd8 t!	pd}=d|=|<f 7 dk
rd7 |3d}>|3j8k
rB|>9j8|3  |3|(k
rZ|>9|(|3  t	
d|1ddgd }	|	
rt:|	dpt:|	dkfnd\}?}@|?d k
rt)|*dp}?|@d k
rt)|*dk}@t)|1dd gd 
p|$}A|1dfd gd p
|*df}.|1dd gd p(|*dg}/|3dlkr^t1|1dnd gd dop`t1|*dndond }Bt)|1djd gd pt)|*dj}C|A|B|?|@|C|/p|.d}D|D D ]\}E}F|Fr|F|>|E< q|1dd gd p|*d}G|Grz|G"d}H|Hd "d}It/|Idckrz|I\}J}Kt;|Hd |>d< |Jdkrzd }Lt	<d|GD ]&}	|	ddkr>|	d}L qfq>|Lrz|>9t=|L |>ddks|>ddkrddi|>d< |&$|> qnt2t|dd8 t!pt2t|dd8 t!}M|Mrzg }&j>|Mddd}N|ND ]t}Ojd|Ods ded d }-|-rR|-|Od< |-j8krRj8|- ? }>|>9|O |>}O|Od< d|O@di d< |&$|O qnT| }P|Pstt|dd8 t!}P|Pstt|dd8 t!}P|Prt|PddUtdt|dd8 t!pt0|dS}Q|Qrt#|Q}Qnjd d }Rd }St	
d}	|	d k	r>|	d}R|	d}Snjd t0|dpj ddd d pjddd dJd}T|Trd|T nd }Ut	
dt	jA}V|Vd k	r|Vd
}Wn,d|krֈjd d }Wnt#|d d }Wj ddd d }X|Xsjddgdd d }XtB|X}XjCdňdd d }Yt	
dǈ}Z|ZrbtDtE|Zd9}[t|Zdȡ}\nd  }[}\fddʄ}]|]d˃}^|]d̃}_|]d̓}`d  }a}b|rTt	
d|}	|	rT|^s|	dϡF }^|_s|	dСpdN'dd+ |	dҡ"dӡD }_|`s
|	dԠF }`|	dա}b|	d֡}a|arF|aGdd}a|bsFt:|ad d؅ }b|brTt:|b}bt	
dو}c|crtE|cdڡ}dt:|cdۡ}et:|cdܡ}fnd  }d }e}fjd݈dd d }g|grވjCd|gdd d }h|hd krd n|hg}ind }idd t	<HdD }jfdd}k|kd}l|kd}m|d kr<tIjddd d }t1|dpXt|dd8 }nJ}oK}pt|dd8 }q|qst)|d}q|qst dd}qd }rjjddr*jddddd}st|dd8 t!}t|sr*|tr*jddddd}ujL|tdddtM|u|sid}rN||q}vjjd1drBd}wD ]}xi zfdd}yt	d |y|x}xjO|x|wj8dD ]D}z|zds|$|zds |zd< |zd kr|z|zd < d}wqW n: ttPfk
r }{ zd|{  W 5 d }{~{X Y nX rPfdd|&D }&|&,Q  qPt	
d}|||rtR||d}}tR||d}~|}dkr|~dkr|}|~ }|&D ] }|ddkr||d< q|&sd	|krXd
|d	 krj dd d }|r|"dFnd }jS|d	 d |d |d	 d }d|krF| }|rF|}td5| dd6|dsxt|dd8 rtdddUT|& U|| |Q|R|S|T|U|X|Y|\p|_||[p|^|W||i|j|o|p|qrڐdnd|r|v|d  ||l|m|n|&||||d|e|f|^|_|`|a|bd&S (  Nprefer_insecureFhttphttpstr   rf  rg  z://www.youtube.com/r   /zI://www.youtube.com/watch?v=%s&gl=US&hl=en&has_verified=1&bpctr=9999999999z1swfConfig.*?"(https?:\\/\\/.*?watch.*?-.*?\.swf)"z\\(.)z\1c                    s,   |  d}|r(|d  kr( |d  d S )NZdashmpdr   )rl   r   )r  dash_mpd	dash_mpdsr3   r4   add_dash_mpd  s    
z-YoutubeIE._real_extract.<locals>.add_dash_mpdc                    s.   t t| dd t}|r*| kr* | d S )Nc                 S   s   | d d S )NstreamingDataZdashManifestUrlr3   r_   r3   r3   r4   rK     rL   zBYoutubeIE._real_extract.<locals>.add_dash_mpd_pr.<locals>.<lambda>)r*   r%   r   r   )pl_responser  r  r3   r4   add_dash_mpd_pr  s     z0YoutubeIE._real_extract.<locals>.add_dash_mpd_prc                 S   s   t t| dd S )Nc                 S   s   | d d S )Nr  r   r3   r_   r3   r3   r4   rK     rL   zEYoutubeIE._real_extract.<locals>.extract_view_count.<locals>.<lambda>)r   r%   )Zv_infor3   r3   r4   extract_view_count  s    z3YoutubeIE._real_extract.<locals>.extract_view_countc                    s:   t | }|sd S j||dd}t|tr6 | |S d S r   )r#   r  r   dict)r  r8   r  )r  r2   r3   r4   extract_player_response  s    
z8YoutubeIE._real_extract.<locals>.extract_player_responsezplayer-age-gate-content">Tz://www.youtube.com/embed/%szDownloading embed webpagez!https://youtube.googleapis.com/v/z"sts"\s*:\s*(\d+)stsrF   r  )r8   Zeurlr  z"://www.youtube.com/get_video_info?z!Refetching age-gated info webpagez%unable to download video info webpagerJ  r  r   Zurl_encoded_fmt_stream_maphlsvpc                 s   s   | ]\}}||gfV  qd S rX   r3   )r;   kr  r3   r3   r4   rA    s     z*YoutubeIE._real_extract.<locals>.<genexpr>Zypc_vidr7   
livestream1Zlive_playbackr  c                     sR   g } dD ]6\}} j dj||dd| d d}|r| | q| rNd| S d S )N))Zh1r[   )divZ
submessagezA(?s)<{tag}[^>]+id=["\']unavailable-{kind}["\'][^>]*>(.+?)</{tag}>)tagr  zunavailable %sr  
)_html_search_regexrv   r   rB  )messagesr  r  msgr2   video_webpager3   r4   extract_unavailable_message  s      z<YoutubeIE._real_extract.<locals>.extract_unavailable_messagezUnable to extract video datazYouTube said: %s)rA   r8   c                 S   s   | d S )NZvideoDetailsr3   r_   r3   r3   r4   rK     rL   z)YoutubeIE._real_extract.<locals>.<lambda>r   zUnable to extract video titler  zeow-descriptionc                    s^   t  | d}t|}td|jrZ|jdkrZt|j	}|
d}|rZ|d rZ|d S |S )Nr   z4^(?:www\.)?(?:youtube(?:-nocookie)?\.com|youtu\.be)$z	/redirectqr   )r   rx  r   r   rG   r   netlocrR  r   r~   rl   )r  Z	redir_urlZparsed_redir_urlr  r  r  r3   r4   replace_url  s    

z,YoutubeIE._real_extract.<locals>.replace_urla  (?x)
                <a\s+
                    (?:[a-zA-Z-]+="[^"]*"\s+)*?
                    (?:title|href)="([^"]+)"\s+
                    (?:[a-zA-Z-]+="[^"]*"\s+)*?
                    class="[^"]*"[^>]*>
                [^<]+\.{3}\s*
                </a>
            r  ZshortDescriptionZforce_singlefeed
noplaylistc                 S   s   | d d d S )NZmulticameraZplayerLegacyMulticameraRendererZmetadataListr3   r_   r3   r3   r4   rK   (  rL   c                 S   s   | d d S )Nmultifeed_metadata_listr   r3   r_   r3   r3   r4   rK   *  rL   r  url_transparentr6   z%s://www.youtube.com/watch?v=%sr   z%s (%s))_typeie_keyrU   r   zNDownloading multifeed video (%s) - add --no-playlist to just download video %srl  2Downloading just video %s because of --no-playlistZ	viewCountZisLiveZypc_video_rental_bar_textauthorzj"rental" videos not supported. See https://github.com/ytdl-org/youtube-dl/issues/359 for more information.r@   c                    s   t  jd| dd dS )Nz\bclen[=/](\d+)filesizer  )r   rs  )	media_urlr1   r3   r4   _extract_filesizeO  s       z2YoutubeIE._real_extract.<locals>._extract_filesizec                 S   s   | d d S )Nr  r"  r3   r_   r3   r3   r4   rK   S  rL   c                 S   s   | d d S )Nr  ZadaptiveFormatsr3   r_   r3   r3   r4   rK   T  rL   connr   r   )	format_idr   rU   r^  Zadaptive_fmtszrtmpe%3Dyesznrtmpe downloads are not supported, see https://github.com/ytdl-org/youtube-dl/issues/343 for more information.fmt_listr`   r   )
resolutionr   r   itagqualityZqualityLabelZaudioSampleRateZcontentLengthr   r   r   ZaverageBitratebitratei  r   )asrr  r   r   r   tbrr   Zdrm_familiesrU   cipherc                 S   s   | d d S )NrU   r   r3   r_   r3   r3   r4   rK     rL   c                 S   s   | d d S )Nstream_typer   r3   r_   r3   r3   r4   rK     rL   r   rJ   z"assets":.+?"js":\s*("[^"]+")zJS player URL (1)zJS player URLz(ytplayer\.config.*?"url"\s*:\s*("[^"]+")zage gate player URLrq  z&signature=rI  unknownrK  z-(.+?)(?:/watch_as3)?\.swf$zflash playerrh   zflash player %sz2html5player-([^/]+?)(?:/html5player(?:-new)?)?\.jszD(?:www|player(?:_ias)?)[-.]([^/]+)(?:/[a-z]{2,3}_[A-Z]{2})?/base\.jszhtml5 playerzhtml5 player %sz{%s} signature length %s, %sc                 S   s   | d d S )Nspr   r3   r_   r3   r3   r4   rK     rL   	signaturez&%s=%sZ
ratebypassz&ratebypass=yes)r  rU   r^  z#^(?P<width>\d+)[xX](?P<height>\d+)$sizeNNZclenquality_label)r  r  r   r   r   r   r  mimeType;r   )audiovideozC(?P<key>[a-zA-Z_-]+)=(?P<quote>["\']?)(?P<val>.+?)(?P=quote)(?:;|$)keycodecsvalr   r   r   http_chunk_sizei   downloader_optionsc                 S   s   | d d S )Nr  ZhlsManifestUrlr3   r_   r3   r3   r4   rK     rL   c                 S   s   | d d S )Nr  r   r3   r_   r3   r3   r4   rK     rL   r   z/itag/(\d+)/r  r^  Truehttp_headerszYoutubedl-no-compressionc                 S   s   | d d S )NZplayabilityStatusreasonr3   r_   r3   r3   r4   rK   2  rL   c                 S   s   | d d S )Nr  r   r3   r_   r3   r3   r4   rK   6  rL   z\no conn, hlsvp, hlsManifestUrl or url_encoded_fmt_stream_map information found in video infoc                 S   s   | d d S )Nr  r   r3   r_   r3   r3   r4   rK   =  rL   zunable to extract uploader namezq<link itemprop="url" href="(?P<uploader_url>https?://www\.youtube\.com/(?:user|channel)/(?P<uploader_id>[^"]+))">r   r   z#unable to extract uploader nickname	channelId
channel idz6data-channel-external-id=(["\'])(?P<id>(?:(?!\1).)+)\1r  r   z!http://www.youtube.com/channel/%sz*<span itemprop="thumbnail".*?href="(.*?)">thumbnail_urlz!unable to extract video thumbnaildatePublishedzupload datez (?s)id="eow-date.*?>(.*?)</span>z(?:id="watch-uploader-info".*?>.*?|["\']simpleText["\']\s*:\s*["\'])(?:Published|Uploaded|Streamed live|Started) on (.+?)[<"\']zI<h4[^>]+class="title"[^>]*>\s*License\s*</h4>\s*<ul[^>]*>\s*<li>(.+?)</lir%  a  (?x)
                <h4[^>]+class="title"[^>]*>\s*Music\s*</h4>\s*
                <ul[^>]*>\s*
                <li>(?P<title>.+?)
                by (?P<creator>.+?)
                (?:
                    \(.+?\)|
                    <a[^>]*
                        (?:
                            \bhref=["\']/red[^>]*>|             # drop possible
                            >\s*Listen ad-free with YouTube Red # YouTube Red ad
                        )
                    .*?
                )?</li
            r  c                    s    j d|  | d dS )NzH<h4[^>]+class="title"[^>]*>\s*%s\s*</h4>\s*<ul[^>]*>\s*<li>(.+?)</li>\s*r  )r  )fieldr  r3   r4   extract_meta  s      z-YoutubeIE._real_extract.<locals>.extract_metaZSongZArtistZAlbumu   (?s)Provided to YouTube by [^\n]+\n+(?P<track>[^·]+)·(?P<artist>[^\n]+)\n+(?P<album>[^\n]+)(?:.+?℗\s*(?P<release_year>\d{4})(?!\d))?(?:.+?Released on\s*:\s*(?P<release_date>\d{4}-\d{2}-\d{2}))?(.+?\nArtist\s*:\s*(?P<clean_artist>[^\n]+))?r  Zclean_artistc                 s   s   | ]}|  V  qd S rX   )r   )r;   ar3   r3   r4   rA    s     r     ·r.  r3  r2  -r^   u   <div[^>]+id="watch7-headline"[^>]*>\s*<span[^>]*>.*?>(?P<series>[^<]+)</a></b>\s*S(?P<season>\d+)\s*•\s*E(?P<episode>\d+)</span>r/  seasonepisodez6(?s)<h4[^>]*>\s*Category\s*</h4>\s*<ul[^>]*>(.*?)</ul>r  z(?s)<a[^<]+>(.*?)</a>categoryc                 S   s   g | ]}t |d qS )r   r  r  r3   r3   r4   r<     s   z+YoutubeIE._real_extract.<locals>.<listcomp>zog:video:tagc                    s    t  jdt|  | d dS )NzL-%s-button[^>]+><span[^>]+class="yt-uix-button-content"[^>]*>([\d,]+)</span>r  )r$   rs  rG   escape)Z
count_namer  r3   r4   _extract_count  s      z/YoutubeIE._real_extract.<locals>._extract_countlikedislikez4<[^>]+class=["\']watch-view-count[^>]+>\s*([\d,\s]+)z
view countZaverageRatingc                 S   s   t | d d S )NZ
avg_ratingr   )r   r_   r3   r3   r4   rK     rL   c                 S   s   t | d d S )NZlength_secondsr   )r   r_   r3   r3   r4   rK     rL   ZlengthSecondsr  zvideo durationwriteannotationszB([\'"])XSRF_TOKEN\1\s*:\s*([\'"])(?P<xsrf_token>[A-Za-z0-9+/=]+)\2z
xsrf token
xsrf_token)r   rD   c                 S   s   | d d d d S )Nannotationsr   ZplayerAnnotationsUrlsRendererZ
invideoUrlr3   r_   r3   r3   r4   rK     rL   z@([\'"])XSRF_FIELD_NAME\1\s*:\s*([\'"])(?P<xsrf_field_name>\w+)\2zxsrf field namexsrf_field_nameZsession_token)r   r  zDownloading annotationsz$Unable to download video annotations)rB   rC   rD   rN   c                    s"   |  d}| }d| S )Nr   z/signature/%s)r   r~  )r   rJ   Zdec_s)r|  r^  r2   r8   r3   r4   decrypt_sig  s    
z,YoutubeIE._real_extract.<locals>.decrypt_sigz/s/([a-fA-F0-9\.]+))rD   formats_dictr  zSkipping DASH manifest: %rc                    s    g | ]}|d     kr|qS )r  )keys)r;   f)dash_formatsr3   r4   r<   	  s      zS<meta\s+property="og:video:tag".*?content="yt:stretch=(?P<w>[0-9]+):(?P<h>[0-9]+)">whr   r  z?The uploader has not made this video available in your country.ZregionsAllowed)r  	countrieszInvalid parametersZlicense_infoc                 S   s   | d d S )Nr  ZlicenseInfosr3   r_   r3   r3   r4   rK   9	  rL   zThis video is DRM protected.r  z://www.youtube.com/watch?v=%s)&r   r   r   r   r   r   r   r%  r  r   r  	thumbnailr  r  r  	subtitlesautomatic_captionsr  r  r+  r  webpage_urlr  r  r  average_ratingr"  is_liver  r	  r/  r0  r1  r  r  r.  r2  r3  )Vr(   rY   rk   rl   r   fragmentr~   r   r   rG   r   _NEXT_URL_REr   r   lstripr  rn   rH   r   rs  r   r  r  itemsr:   r   r  r   r%   rZ   r   r   _html_search_metar   rC  r   r   r"   r7  rB  r   r   r   rs   r  rw  r<  r?  r#   r   r*   rR   loadsendswithrE  r~  _formatsrQ   intr   r   r   _extract_m3u8_formatsrP   
setdefaultDOTALLr'   r  r    r&   r   replace_meta_regexr$   extract_subtitlesextract_automatic_captions_proto_relative_urlr+   r  _extract_mpd_formatsr  valuesfloatraise_geo_restricted_sort_formatsmark_watched)r2   rU   Zsmuggled_dataprotor  r	  
parsed_urlZ	componentr~   r   r  r:  r  r  r  r  r  Zembed_webpagerN   Zvideo_info_urlZvideo_info_webpager  Zytplayer_configr   r  Zunavailable_messageZvideo_detailsr   Zdescription_originalZvideo_descriptionr  r  r  Zfeed_idsfeedZ	feed_datar  Zstreaming_formatsr"  Zencoded_url_mapZformats_specr  r  specZwidth_heightr  r   r  r  Zurl_datar  r  Z	ASSETS_REZjsplayer_url_jsonZ	embed_urlZplayer_url_jsonZencrypted_sigZplayer_versionZplayer_descZparts_sizesr  r  dctr   r   r  r  r   Zmore_fieldsr  valueZtype_Z
type_splitZkind_extr  r  r  manifest_urlm3u8_formatsa_formatZerror_messageZvideo_uploaderZvideo_uploader_idZvideo_uploader_urlr   r   Zm_thumbZvideo_thumbnailr   Zvideo_licenseZm_musicZvideo_alt_titleZvideo_creatorr  r  r  r.  r2  r3  Z	m_episoder/  r0  r1  Zm_cat_containerr$  Zvideo_categoriesZ
video_tagsr&  r  r  r9  Zvideo_subtitlesr7  Zvideo_durationZvideo_annotationsr*  Zinvideo_urlr,  r  Zdash_mpd_fatalmpd_urlr-  Zdfr   Zstretched_mr2  r3  Zratior0  Zregions_allowedr4  r  r3   )	r  r|  r1  r  r^  r2   rU   r8   r  r4   r   v  sf   

	    



       
 	
  


D(




(


 
    

 



  
 
   

*

 &

 

          
  


       

       ,

    
              
        
zYoutubeIE._real_extract)F)%r   r   r   IE_DESCr,   r   r  r<  rB  r  _GEO_BYPASSrm   rC  _TESTSr4  r9  r:  r;  r<  rE  rc  ro  rW  rZ  r~  r  r  r  r  staticmethodr  r  classmethodr  r  r   r   r3   r3   r   r4   r   q  s  89

i            
 
6 D	 
                    :.' f"r   c                   @   s  e Zd ZdZddeji ZdZdZed Z	dZ
dd	d
ddddddd	d
ddddddddddddddddddd d dd!d"d#d$d%d&d'd(dd)d"d*d+d*d,d-d.d/d0d1d2d3d4d5d6dd7d8d9d:d;d<d=dd>d?d@d2dAdBd,dCdDdEdFdGdHdIdJddKd"dLdMdNdOdPdQdRdSdTdUdVgeeeedWdXdYidZe gd[d\d]d^d_d`dadbdcdddegeeedfdYdYdgdhdidjdkdldldmdndodpdYdqdrdYdqdsdYdqdtdYdqdudYdqgZdvdw Zdxdy Zdzd{ Zd|d} Zd~d Zdd ZdS )YoutubePlaylistIEzYouTube.com playlistsa  (?x)(?:
                        (?:https?://)?
                        (?:\w+\.)?
                        (?:
                            (?:
                                youtube(?:kids)?\.com|
                                invidio\.us
                            )
                            /
                            (?:
                               (?:course|view_play_list|my_playlists|artist|playlist|watch|embed/(?:videoseries|[0-9A-Za-z_-]{11}))
                               \? (?:.*?[&;])*? (?:p|a|list)=
                            |  p/
                            )|
                            youtu\.be/[0-9A-Za-z_-]{11}\?.*?\blist=
                        )
                        (
                            (?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)?[0-9A-Za-z-_]{10,}
                            # Top tracks, they can also include dots
                            |(?:MC)[\w\.]*
                        )
                        .*
                     |
                        (%(playlist_id)s)
                     )r   r   zYhref="\s*/watch\?v=%s(?:&amp;(?:[^"]*?index=(?P<index>\d+))?(?:[^>]+>(?P<title>[^<]+))?)?z(?P<id>[0-9A-Za-z_-]{11})zyoutube:playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcZUCmlqkdCBesrv2Lak1mF_MxAz	Sergey M.Z"PL4lCao7KL_QFVb7Iudeipvc2BCavECqzczyoutube-dl public playlist)r   r   r   r   r   )rU   r
  r*  zHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfz"PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfzyoutube-dl empty playlistr   zZPlaylist 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 departmentZ"PLwP_SiAcdui0KVebT0mU9Apz359a4ubsCZChristiaan008ZChRiStIaAn008)r   r   r   r   r   )rB   rU   r
  r*  z
issue #673ZPLBB231211A4F62143z%[OLD]Team Fortress 2 (Class-based LP)ZWickydoo   )rB   rU   r
  playlist_mincountzLarge playlistz>https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0QzUploads from CauchemarZUUBABnxM4Ar9ten8Mdjj1j0QZ	CauchemarZCauchemar89i  Z"PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlZYDL_safe_search)r   r   r   zThis playlist is privater)  ZembeddedzQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEur^   ZJODA15Z"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEuZmilanzUCEI1-PVPcYXjB73Hfelbmaw)rB   rU   r*  r
  zPhttp://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIli  z'2018 Chinese New Singles (11/6 updated)Z"PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIlZLBKZsdragonfangrU   rc  r
  zEmbedded SWF playerzNhttps://www.youtube.com/p/YN5VISEtHet5D4NEvfTd0zcgFk84NqFZ?hl=en_US&fs=1&rel=0ZJODA7Z YN5VISEtHet5D4NEvfTd0zcgFk84NqFZzThis playlist does not exist)rB   rU   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Interstellar MovieZInterstellarMovie1   zThttps://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4ZFqZTN594JQwr   z6Smiley's People 01 detective, Adventure Series, ActionZSTREEMZUCyPhqAZgwYWZfxElWVbVJngzCre:https?://(?:www\.)?youtube\.com/channel/UCyPhqAZgwYWZfxElWVbVJngZ20150526r$  z$md5:507cdcb5a49ac0da37a920ece610be80zPeople & Blogs)r   r   r   r   r   r   r   r%  r  r  r  r  r  r  r  Tr&  )rU   r
  rk   r  add_iezDhttps://youtu.be/yeWKywCrFtk?list=PL2qgrgXsNUG5ig9cat4ohreBjYLAPC0J5ZyeWKywCrFtkr   z#Small Scale Baler and Braiding RugszBackus-Page House MuseumZbackuspagemuseumz8re:https?://(?:www\.)?youtube\.com/user/backuspagemuseumZ20161008z$md5:800c0c78d5eb128500bffd4f0b4f2e8azNonprofits & Activism)r   r   r   r   r   r   r   r  r  r  r  r  )r  r  r  zHhttps://www.youtube.com/playlist?list=PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz Data Analysis with Dr Mike PoundZ"PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baZComputerphile)r   r   r   r      )rU   r
  rc  z4https://youtu.be/uWyaPkt-VOI?list=PL9D9FC436B881BA21r+  ZTLGGrESM50VT6acwMjAyMjAxNwZ)OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMzChttps://invidio.us/playlist?list=PLDIoUOhQQPlXr63I_vwF9GD8sAKh77dWUzMhttps://www.youtubekids.com/watch?v=Agk7R8I8o5U&list=PUZ6jURNr1WQZCNHF0ao-c0gc                 C   s   |    d S rX   r}   r1   r3   r3   r4   r   /
  s    z"YoutubePlaylistIE._real_initializec                 C   s   g }g }t d|D ]B}t|}|d }t|d}|rB| }|| || q| | j||| | d||| | d||| t	||S )Nz:(<[^>]*\bdata-video-id\s*=\s*["\'][0-9A-Za-z_-]{11}[^>]+>)zdata-video-idz
data-titlez2href="\s*/watch\?v\s*=\s*(?P<id>[0-9A-Za-z_-]{11})z3data-video-ids\s*=\s*["\'](?P<id>[0-9A-Za-z_-]{11}))
rG   r   r   r&   rl   r   r   r   r   r   )r2   r   r   r   itemattrsr8   r   r3   r3   r4   r   2
  s@     
       z*YoutubePlaylistIE.extract_videos_from_pagec           
         s   g  |dd  }t dD ]j}d||f }| ||d|ttdt| } fdd|D }|sr q |  d }q| 	 }fd	d
}|dp|dp|d}t
|}	| |||	S )Nir   z&https://youtube.com/watch?v=%s&list=%sz#Downloading page {0} of Youtube mixzr(?xs)data-video-username=".*?".*?
                           href="/watch\?v=([0-9A-Za-z_-]{11})&amp;[^"]*?list=%sc                    s   g | ]}| kr|qS r3   r3   )r;   Z_idr=   r3   r4   r<   ]
  s      z2YoutubePlaylistIE._extract_mix.<locals>.<listcomp>rd   c                    s   t d|  S )Nclass)r   )
class_name)r   r3   r4   rK   e
  rL   z0YoutubePlaylistIE._extract_mix.<locals>.<lambda>zplaylist-titleztitle long-titler   )r   r   rn   rv   r   rG   r   r%  r  r>   r   r   )
r2   r   Zlast_idnrU   new_idsZurl_resultsZsearch_titleZ
title_spanr   r3   )r=   r   r4   _extract_mixN
  s:      


zYoutubePlaylistIE._extract_mixc                 C   s  | j | }| ||}td|D ]}| }td|}|rv|d}d| }d|kr`|d7 }|d7 }t|dd	q"td
|rtddd	q"td|rq"q"| d|  q"| j	d|dd d}d}	| j	d|	 |dd d}
t
d|	 |}|r|d}t||d}nd  }}d}|sRzt| || W n tk
rP   d}Y nX | | ||||}||
||d ||fS )Nz0<div class="yt-alert-message"[^>]*>([^<]+)</div>zE[^<]*(?:The|This) playlist (?P<reason>does not exist|is private)[^<]*r  zThis playlist %sZprivatez(, use --username or --netrc to access itr=  Tr@   z[^<]*Invalid parameters[^<]*z+Invalid parameters. Maybe URL is incorrect.z[^<]*Choose your language[^<]*z Youtube gives an alert message: z:(?s)<h1 class="pl-header-title[^"]*"[^>]*>\s*(.*?)\s*</h1>r   r  z:class=["\']pl-header-details[^>]+>\s*<li>\s*<a[^>]+\bhref=z&%s["\']/(?:user|channel)/[^>]+>([^<]+)r   z;%s(["\'])(?P<path>/(?:user|channel)/(?P<uploader_id>.+?))\1r   rR  F)r   r   r   )_TEMPLATE_URLrn   rG   r   r   rP  r   r   rZ   r  r   r   rx  nextr   StopIterationr   rQ   )r2   r   rU   r   rP  r   r  r[   playlist_titleZ_UPLOADER_BASEr   r   r   
has_videosr'  r3   r3   r4   _extract_playlistn
  st    

    


  z#YoutubePlaylistIE._extract_playlistc                 C   s   t t |j}|dd gd p4| jd|dd d}|r| jjdrj| d|  || j	|d|d	fS | d
||f  |d fS dS )Nr  r   zL(?:(?:^|//)youtu\.be/|youtube\.com/embed/(?!videoseries))([0-9A-Za-z_-]{11})video idr  r  r  r6   r7   zEDownloading playlist %s - add --no-playlist to just download video %sr
  )
r   r  r  r~   rl   rs  rY   rk   r7  r:   )r2   rU   r   Z
query_dictr8   r3   r3   r4   _check_download_just_video
  s      z,YoutubePlaylistIE._check_download_just_videoc                 C   s   t | j|}|d kr"td| |dp4|d}| ||\}}|rN|S |drb| |S | |\}}|sx|s||S | j	|d|dS )Nr  r   r   )ZRDZULZPUr6   r7   )
rG   rP  r  r   r   rx  rw  rp  rv  r:   )r2   rU   r   r   r8   r  ru  r'  r3   r3   r4   r   
  s    

zYoutubePlaylistIE._real_extractN)r   r   r   r\  r,   r   r  rq  Z_VIDEO_RE_TPLr   rm   rs   rC  r   r  r^  r   r   rp  rv  rx  r   r3   r3   r3   r4   ra  j	  sH  

	

   ' >ra  c                	       s   e Zd ZdZdZdZdZdZdddd	d
dddddddddddddddddddgZe	 fddZ
dd Zdd Z  ZS ) YoutubeChannelIEzYouTube.com channelszuhttps?://(?:youtu\.be|(?:\w+\.)?youtube(?:-nocookie|kids)?\.com|(?:www\.)?invidio\.us)/channel/(?P<id>[0-9A-Za-z_-]+)z)https://www.youtube.com/channel/%s/videoszJ(?:title="(?P<title>[^"]+)"[^>]+)?href="/watch\?v=(?P<id>[0-9A-Za-z_-]+)&?zyoutube:channelzpaginated channelz8https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w[   ZUUKfVa3S1e4PHvxWcwyMMg8wzUploads from lex willzlex willZUCKfVa3S1e4PHvxWcwyMMg8wr   r   r   r   )rB   rU   rc  r
  zAge restricted channelz8https://www.youtube.com/channel/UCs0ifCMCm1icqRbqhUINa0wr   ZUUs0ifCMCm1icqRbqhUINa0wzUploads from Deus ExzDeus ExZDeusExOfficialz3https://invidio.us/channel/UC23qupoDRn9YOAVzeoxjOQATr+  z<https://www.youtubekids.com/channel/UCyu8StPfZWapR6rfW_JgqcAc                    s(   t |st|rdS tt| |S )NF)YoutubePlaylistsIEsuitableYoutubeLiveIEr   ry  r  rU   r   r3   r4   r}  
  s    zYoutubeChannelIE.suitablec                 C   s
   | j | S rX   )rq  )r2   rU   r   r3   r3   r4   _build_template_url
  s    z$YoutubeChannelIE._build_template_urlc           
   
      s^    |} ||} j|d |ddd}|dkr:d}n> jd|dd d}|sx jd|d	d d}|rx jd
|dd d}|r|drd|dd   } t|d| dS  ||d}t	
d|d k	}|r fdd |D } ||S zt || W n@ tk
rH    jd|dd dd}	|	rDtd|	 ddY nX   |||S )Nz?view=57zDownloading channel pageFrh   r  r  r  )z
al:ios:urlztwitter:app:url:iphoneztwitter:app:url:ipadzchannel urlz$vnd\.youtube://user/([0-9A-Za-z_-]+)ZUCZUUr   z/playlist?list=%sr   zDownloading page #1z(?x)
                class="[^"]*?(?:
                    channel-header-autogenerated-label|
                    yt-channel-title-autogenerated
                )[^"]*"c                    s"   g | ]\}} j |d ||dqS )r6   )r8   r   r9   )r;   r8   r   r1   r3   r4   r<   '  s     z2YoutubeChannelIE._real_extract.<locals>.<listcomp>zR(?s)<div[^>]+class=(["\']).*?\byt-alert-message\b.*?\1[^>]*>(?P<alert>[^<]+)</div>Zalertr  zYoutube said: %sTr@   )r   r  rn   r?  rs  rw  r:   r   rx  rG   r   r   r   rr  r   rs  r  r   )
r2   rU   r   Zchannel_pageZchannel_playlist_idr   r   Zautogeneratedr  Zalert_messager3   r1   r4   r      sx    
          
   zYoutubeChannelIE._real_extract)r   r   r   r\  r  rq  r   rm   r^  r`  r}  r  r   r   r3   r3   r   r4   ry  
  sD   ry  c                       s   e Zd ZdZdZdZdZddddd	d
ddddddddddddddddddddddgZe fddZ	dd Z
  ZS )YoutubeUserIEz1YouTube.com user videos (URL or "ytuser" keyword)z(?:(?:https?://(?:\w+\.)?youtube\.com/(?:(?P<user>user|c)/)?(?!(?:attribution_link|watch|results|shared)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)(?P<id>[A-Za-z0-9_-]+)z$https://www.youtube.com/%s/%s/videoszyoutube:userz/https://www.youtube.com/user/TheLinuxFoundationr   ZUUfX55Sx5hEFjoC3cNs6mCUQz!Uploads from The Linux FoundationzThe Linux FoundationZTheLinuxFoundationr{  rd  z0https://www.youtube.com/c/12minuteathlete/videos   zUUVjM-zV6_opMDx7WYxnjZiQzUploads from 12 Minute Athletez12 Minute AthleteZthe12minuteathletezytuser:phihagTr+  z&https://www.youtube.com/c/gametrailersz$https://www.youtube.com/gametrailersz3https://www.youtube.com/user/kananishinoSMEJ/videosc                    sJ   t  fddt  D }tfdd|D r6dS tt S d S )Nc                 3   s2   | ]*\}}| d r|dr| k	r|V  qdS )r6   IEN)rw  rA  )r;   r  klass)r  r3   r4   rA  g  s
     
 
  z)YoutubeUserIE.suitable.<locals>.<genexpr>c                 3   s   | ]}|  V  qd S rX   )r}  )r;   ier  r3   r4   rA  h  s     F)iterglobalsr>  anyr   r  r}  )r  rU   Zother_yt_iesr   r  r4   r}  c  s    zYoutubeUserIE.suitablec                 C   s,   t | j|}| j|dpd|df S )Nuserr   )rG   rP  r  rq  r   )r2   rU   r   r   r3   r3   r4   r  m  s    z!YoutubeUserIE._build_template_url)r   r   r   r\  r  rq  rm   r^  r`  r}  r  r   r3   r3   r   r4   r  :  sH   #	r  c                   @   sn   e Zd ZdZdZdZdddddd	d
ddddgdddgeedddiddddddddddgZdd ZdS )r~  zYouTube.com live streamszX(?P<base_url>https?://(?:\w+\.)?youtube\.com/(?:(?:user|channel|c)/)?(?P<id>[^/]+))/livezyoutube:livez/https://www.youtube.com/user/TheYoungTurks/liveZa48o2S1cPoor   z The Young Turks - Live Main ShowzThe Young TurksZTheYoungTurksz5re:https?://(?:www\.)?youtube\.com/user/TheYoungTurksZ20150715r$  z$md5:438179573adcdff3c97ebb1ee632b891zNews & PoliticszCenk Uygur (TV Program Creator)z$The Young Turks (Award-Winning Work)zTalk Show (TV Genre))r   r   r   r   r   r   r   r%  r  r  r  r  r  r  Tr  z=https://www.youtube.com/channel/UC1yBKRuGpC1tSM73A0ZjYjQ/liver+  z/https://www.youtube.com/c/CommanderVideoHq/livez*https://www.youtube.com/TheYoungTurks/livec                 C   s   t | j|}|d}|d}| j||dd}|r| jd|ddd}| jd	|d
d d}|dr|rt d|r| |t	
 S | |S )Nr   r  Frh   r  z	page typerF   r  ZvideoIdrw  r  z^[0-9A-Za-z_-]{11}$)rG   rP  r  r   rn   _og_search_propertyr?  rw  r:   r   r  )r2   rU   r   r   r  r   Z	page_typer8   r3   r3   r4   r     s.    

       zYoutubeLiveIE._real_extractN)	r   r   r   r\  r  rm   rC  r^  r   r3   r3   r3   r4   r~  r  sB    r~  c                   @   sN   e Zd ZdZdZdZddddddd	d
dddddddddddgZdS )r|  z"YouTube.com user/channel playlistszHhttps?://(?:\w+\.)?youtube\.com/(?:user|channel)/(?P<id>[^/]+)/playlistszyoutube:playlistsz7https://www.youtube.com/user/ThirstForScience/playlistsr^   ZThirstForSciencer(  rd  z>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=ddr   Zigorkle1u   Игорь КлейнерzBhttps://www.youtube.com/channel/UCiU1dHvZObB2iP6xkJ__Icw/playlists   ZUCiU1dHvZObB2iP6xkJ__IcwzChem PlayerZBlocked)rU   rc  r
  r  N)r   r   r   r\  r  rm   r^  r3   r3   r3   r4   r|    s.   		r|  c                   @   s   e Zd ZdZdS )YoutubeSearchBaseInfoExtractorzUhref="\s*/watch\?v=(?P<id>[0-9A-Za-z_-]{11})(?:[^"]*"[^>]+\btitle="(?P<title>[^"]+))?N)r   r   r   r   r3   r3   r3   r4   r    s   r  c                   @   s0   e Zd ZdZedZdZdZi Zg Z	dd Z
dS )YoutubeSearchIEzYouTube.com searchesinfzyoutube:searchZytsearchc                 C   s   g }|}d| di}|| j dt| }tdD ]}| j|d| d| ddd	id
}|d d d }	d|	krtdddt| 	|	}
||
7 }|
rt
||kr q| jd|	ddd}|dkr qtd|}q8t
||kr|d| }| ||S )z-Get a specified number of results for a queryZsearch_queryr  z https://www.youtube.com/results?r   z
query "%s"zDownloading page %szUnable to download API pageZspfZnavigate)r8   rB   rC   r~   bodyr   zclass="search-messagez[youtube] No video resultsTr@   zjhref="(/results\?[^"]*\bsp=[^"]+)"[^>]*>\s*<span[^>]+class="[^"]*\byt-uix-button-content\b[^"]*"[^>]*>Nextz	next linkNr  zhttps://www.youtube.com/)r  rQ   _EXTRA_QUERY_ARGSr   r   r   rT   r   rs   r   r?  r  r   rx  r   )r2   r~   rn  ZvideoslimitZ	url_queryZ
result_urlpagenumrN   Zhtml_contentZ
new_videosZ	next_linkr3   r3   r4   _get_n_results  sJ         zYoutubeSearchIE._get_n_resultsN)r   r   r   r\  rN  _MAX_RESULTSrm   _SEARCH_KEYr  r^  r  r3   r3   r3   r4   r    s   r  c                   @   s&   e Zd Zejd ZdZdZddiZdS )YoutubeSearchDateIEz:dateZytsearchdatez)YouTube.com searches, newest videos firstZsearch_sortZvideo_date_uploadedN)r   r   r   r  rm   r  r\  r  r3   r3   r3   r4   r    s   
r  c                   @   s:   e Zd ZdZdZdZddddidd	d
dgZdd ZdS )YoutubeSearchURLIEzYouTube.com search URLszyoutube:search_urlz\https?://(?:www\.)?youtube\.com/results\?(.*?&)?(?:search_query|q)=(?P<query>[^&]+)(?:[&]|$)zchttps://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=videorb   r   zyoutube-dl test videord  z2https://www.youtube.com/results?q=test&sp=EgQIBBgBTr+  c                 C   s<   t | j|}t|d}| ||}| j| ||dS )Nr~   rt  )rG   rP  r  r   r   rn   r   r   )r2   rU   r   r~   r   r3   r3   r4   r     s    z YoutubeSearchURLIE._real_extractN)r   r   r   r\  rm   r  r^  r   r3   r3   r3   r4   r    s    r  c                       s<   e Zd ZdZdZdZdddddd	gZ fd
dZ  ZS )YoutubeShowIEz YouTube.com (multi-season) showsz3https?://(?:www\.)?youtube\.com/show/(?P<id>[^?#]*)zyoutube:showz)https://www.youtube.com/show/airdisastersrb   ZairdisasterszAir Disastersr(  rd  c                    s   |  |}tt| d| S )Nz)https://www.youtube.com/show/%s/playlists)r   r   r  r   )r2   rU   r   r   r3   r4   r   %  s    

zYoutubeShowIE._real_extract)	r   r   r   r\  r  rm   r^  r   r   r3   r3   r   r4   r    s   	r  c                   @   s8   e Zd ZdZdZedd Zdd Zdd Zd	d
 Z	dS )YoutubeFeedsInfoExtractorzr
    Base class for feed extractors
    Subclasses must define the _FEED_NAME and _PLAYLIST_TITLE properties.
    Tc                 C   s
   d| j  S )Nz
youtube:%s)
_FEED_NAMEr1   r3   r3   r4   rm   2  s    z!YoutubeFeedsInfoExtractor.IE_NAMEc                 C   s   |    d S rX   rh  r1   r3   r3   r4   r   6  s    z*YoutubeFeedsInfoExtractor._real_initializec           
      #   s   g  | }}t dD ]}td|}tt fddt|}|sH q | | |D ]
}|V  q\t	d|}|s| q| j
d|d | jd| td	}	|	d
 }|	d }qd S )Nr   z&href="\s*/watch\?v=([0-9A-Za-z_-]{11})c                    s   |  kS rX   r3   r7   rk  r3   r4   rK   D  rL   z4YoutubeFeedsInfoExtractor._entries.<locals>.<lambda>r   r   r   zDownloading page #%sr   r   r   )r   r   rG   r   rs   filterr   r  r>   r   rT   r   _PLAYLIST_TITLEr)   )
r2   r   r   r   r   r  ro  r   r   r   r3   rk  r4   r   9  s*    
 z"YoutubeFeedsInfoExtractor._entriesc                 C   s*   |  d| j | j}| j| || jdS )Nzhttps://www.youtube.com/feed/%sr  )rn   r  r  r   r   )r2   rU   r   r3   r3   r4   r   X  s     z'YoutubeFeedsInfoExtractor._real_extractN)
r   r   r   r   rj   propertyrm   r   r   r   r3   r3   r3   r4   r  +  s   
r  c                   @   s4   e Zd ZdZdZdZddddddgZdd	 Zd
S )YoutubeWatchLaterIEzyoutube:watchlaterzMYoutube watch later list, ":ytwatchlater" for short (requires authentication)zfhttps?://(?:www\.)?youtube\.com/(?:feed/watch_later|(?:playlist|watch)\?(?:.+&)?list=WL)|:ytwatchlaterz(https://www.youtube.com/playlist?list=WLTr+  z;https://www.youtube.com/watch?v=bCNU9TrbiRk&index=1&list=WLc                 C   s*   |  |d\}}|r|S | d\}}|S )NZWL)rx  rv  )r2   rU   r  r  r'  r3   r3   r4   r   m  s
    z!YoutubeWatchLaterIE._real_extractNr   r   r   rm   r\  r  r^  r   r3   r3   r3   r4   r  `  s   r  c                   @   s$   e Zd ZdZdZdZdZdd ZdS )YoutubeFavouritesIEzyoutube:favoriteszJYouTube.com favourite videos, ":ytfav" for short (requires authentication)z@https?://(?:www\.)?youtube\.com/my_favorites|:ytfav(?:ou?rites)?Tc                 C   s&   |  dd}| d|d}| |dS )Nz$https://www.youtube.com/my_favoriteszYoutube Favourites videoszlist=(.+?)["&]zfavourites playlist idr   )rn   rs  r:   )r2   rU   r   r   r3   r3   r4   r   {  s    z!YoutubeFavouritesIE._real_extractN)r   r   r   rm   r\  r  rj   r   r3   r3   r3   r4   r  u  s
   r  c                   @   s   e Zd ZdZdZdZdZdS )YoutubeRecommendedIEzLYouTube.com recommended videos, ":ytrec" for short (requires authentication)zDhttps?://(?:www\.)?youtube\.com/feed/recommended|:ytrec(?:ommended)?ZrecommendedzYoutube Recommended videosNr   r   r   r\  r  r  r  r3   r3   r3   r4   r    s   r  c                   @   s   e Zd ZdZdZdZdZdS )YoutubeSubscriptionsIEzJYouTube.com subscriptions feed, "ytsubs" keyword (requires authentication)zHhttps?://(?:www\.)?youtube\.com/feed/subscriptions|:ytsubs(?:criptions)?ZsubscriptionszYoutube SubscriptionsNr  r3   r3   r3   r4   r    s   r  c                   @   s   e Zd ZdZdZdZdZdS )YoutubeHistoryIEzGYoutube watch history, ":ythistory" for short (requires authentication)z7https?://(?:www\.)?youtube\.com/feed/history|:ythistoryhistoryzYoutube HistoryNr  r3   r3   r3   r4   r    s   r  c                   @   sT   e Zd ZdZdZdZdddddddddd	ddd
dddddgZdd ZdS )YoutubeTruncatedURLIEzyoutube:truncated_urlFaX  (?x)
        (?:https?://)?
        (?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/
        (?:watch\?(?:
            feature=[a-z_]+|
            annotation_id=annotation_[^&]+|
            x-yt-cl=[0-9]+|
            hl=[^&]*|
            t=[0-9]+
        )?
        |
            attribution_link\?a=[^&]+
        )
        $
    zAhttps://www.youtube.com/watch?annotation_id=annotation_3951667041Tr+  zhttps://www.youtube.com/watch?z.https://www.youtube.com/watch?x-yt-cl=84503534z)https://www.youtube.com/watch?feature=fooz&https://www.youtube.com/watch?hl=en-GBz$https://www.youtube.com/watch?t=2372c                 C   s   t dddd S )NzDid you forget to quote the URL? Remember that & is a meta character in most shells, so you want to put the URL in quotes, like  youtube-dl "https://www.youtube.com/watch?feature=foo&v=BaW_jenozKc"  or simply  youtube-dl BaW_jenozKc  .Tr@   )r   )r2   rU   r3   r3   r4   r     s    z#YoutubeTruncatedURLIE._real_extractNr  r3   r3   r3   r4   r    s.   r  c                   @   s,   e Zd ZdZdZdZdddgZdd Zd	S )
YoutubeTruncatedIDIEzyoutube:truncated_idFzEhttps?://(?:www\.)?youtube\.com/watch\?v=(?P<id>[0-9A-Za-z_-]{1,10})$z*https://www.youtube.com/watch?v=N_708QY7ObTr+  c                 C   s"   |  |}td||f ddd S )Nz1Incomplete YouTube ID %s. URL %s looks truncated.Tr@   )r   r   )r2   rU   r8   r3   r3   r4   r     s
    

z"YoutubeTruncatedIDIE._real_extractNr  r3   r3   r3   r4   r    s   r  )M
__future__r   r   rR   Zos.pathrQ  r  rG   r0   rz  commonr   r   Zjsinterpr   Z	swfinterpr   compatr	   r
   r   r   r   r   r   r   r   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*   r+   r,   r   r   r   r   ra  ry  r  r~  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r3   r3   r3   r4   <module>   sl   0l a'!                	  me84251