2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# coding: utf-8  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  __future__  import  unicode_literals  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  itertools  
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  json  
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  os . path  
						 
					
						
							
								
									
										
										
										
											2016-03-01 01:01:33 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  random  
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  re  
						 
					
						
							
								
									
										
										
										
											2014-11-30 00:03:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  time  
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  traceback  
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . common  import  InfoExtractor ,  SearchInfoExtractor  
						 
					
						
							
								
									
										
										
										
											2014-03-30 07:02:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . . jsinterp  import  JSInterpreter  
						 
					
						
							
								
									
										
										
										
											2014-07-18 10:24:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . . swfinterp  import  SWFInterpreter  
						 
					
						
							
								
									
										
										
										
											2014-12-11 10:08:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . . compat  import  (  
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_chr , 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-02 00:57:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_kwargs , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    compat_parse_qs , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-17 23:51:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_urllib_parse_unquote , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    compat_urllib_parse_unquote_plus , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-26 01:46:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_urllib_parse_urlencode , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 21:10:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_urllib_parse_urlparse , 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-01 11:58:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_urlparse , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    compat_str , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 10:08:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  . . utils  import  (  
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    clean_html , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-20 07:00:39 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    error_to_compat_str , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ExtractorError , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-11 18:39:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    float_or_none , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 10:08:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    get_element_by_attribute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_element_by_id , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int_or_none , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-25 01:02:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    mimetype2ext , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 10:08:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    orderedSet , 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-12 18:09:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parse_codecs , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 21:10:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parse_duration , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    remove_quotes , 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    remove_start , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    smuggle_url , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-29 00:48:06 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    str_to_int , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    try_get , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    unescapeHTML , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    unified_strdate , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    unsmuggle_url , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 17:56:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    uppercase_escape , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-26 02:19:24 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    urlencode_postdata , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 20:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeBaseInfoExtractor ( InfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    """ Provide base functions for Youtube extractors """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _LOGIN_URL  =  ' https://accounts.google.com/ServiceLogin ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 22:11:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TWOFACTOR_URL  =  ' https://accounts.google.com/signin/challenge ' 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _LOOKUP_URL  =  ' https://accounts.google.com/_/signin/sl/lookup ' 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _CHALLENGE_URL  =  ' https://accounts.google.com/_/signin/sl/challenge ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _TFA_URL  =  ' https://accounts.google.com/_/signin/challenge?hl=en&TL= {0} ' 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _NETRC_MACHINE  =  ' youtube ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # If True it will raise an error if no login info is provided 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _LOGIN_REQUIRED  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-25 01:17:17 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _PLAYLIST_ID_RE  =  r ' (?:PL|LL|EC|UU|FL|RD|UL|TL)[0-9A-Za-z-_] { 10,} ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _set_language ( self ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-04 08:27:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . _set_cookie ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' .youtube.com ' ,  ' PREF ' ,  ' f1=50000000&hl=en ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 00:03:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # YouTube sets the expire time to about two months 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-04 08:27:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            expire_time = time . time ( )  +  2  *  30  *  24  *  3600 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _ids_to_results ( self ,  ids ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . url_result ( vid_id ,  ' Youtube ' ,  video_id = vid_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  vid_id  in  ids ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _login ( self ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-16 14:28:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        """ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        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 . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( username ,  password )  =  self . _get_login_info ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # No authentication to be performed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  username  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  self . _LOGIN_REQUIRED : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  ExtractorError ( ' No login info available, needed for using  %s . '  %  self . IE_NAME ,  expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-16 14:28:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  True 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        login_page  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _LOGIN_URL ,  None , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            note = ' Downloading login page ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            errnote = ' unable to fetch login page ' ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  login_page  is  False : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-24 00:25:21 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        login_form  =  self . _hidden_inputs ( login_page ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  req ( url ,  f_req ,  note ,  errnote ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data  =  login_form . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data . update ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' pstMsg ' :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' checkConnection ' :  ' youtube ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' checkedDomains ' :  ' youtube ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' hl ' :  ' en ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' deviceinfo ' :  ' [null,null,null,[],null, " US " ,null,null,[], " GlifWebSignIn " ,null,[null,null,[]]] ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' f.req ' :  json . dumps ( f_req ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' flowName ' :  ' GlifWebSignIn ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' flowEntry ' :  ' ServiceLogin ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-15 22:03:43 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  self . _download_json ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                url ,  None ,  note = note ,  errnote = errnote , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                transform_source = lambda  s :  re . sub ( r ' ^[^[]* ' ,  ' ' ,  s ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                fatal = False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                data = urlencode_postdata ( data ) ,  headers = { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' Content-Type ' :  ' application/x-www-form-urlencoded;charset=utf-8 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' Google-Accounts-XSRF ' :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  warn ( message ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( message ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        lookup_req  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            username , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            None ,  [ ] ,  None ,  ' US ' ,  None ,  None ,  2 ,  False ,  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                None ,  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                [ 2 ,  1 ,  None ,  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                 ' https://accounts.google.com/ServiceLogin?passive=true&continue=https % 3A %2F %2F www.youtube.com %2F signin %3F next % 3D %252F %26a ction_handle_signin % 3Dtrue % 26hl % 3Den %26a pp % 3Ddesktop %26f eature % 3Dsign_in_button&hl=en&service=youtube&uilel=3&requestPath= %2F ServiceLogin&Page=PasswordSeparationSignIn ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                 None ,  [ ] ,  4 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                1 ,  [ None ,  None ,  [ ] ] ,  None ,  None ,  None ,  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            username , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        lookup_results  =  req ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _LOOKUP_URL ,  lookup_req , 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' Looking up account info ' ,  ' Unable to look up account info ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  lookup_results  is  False : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-15 22:03:43 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        user_hash  =  try_get ( lookup_results ,  lambda  x :  x [ 0 ] [ 2 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  user_hash : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            warn ( ' Unable to extract user hash ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        challenge_req  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            user_hash , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            None ,  1 ,  None ,  [ 1 ,  None ,  None ,  None ,  [ password ,  None ,  True ] ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                None ,  None ,  [ 2 ,  1 ,  None ,  1 ,  ' https://accounts.google.com/ServiceLogin?passive=true&continue=https % 3A %2F %2F www.youtube.com %2F signin %3F next % 3D %252F %26a ction_handle_signin % 3Dtrue % 26hl % 3Den %26a pp % 3Ddesktop %26f eature % 3Dsign_in_button&hl=en&service=youtube&uilel=3&requestPath= %2F ServiceLogin&Page=PasswordSeparationSignIn ' ,  None ,  [ ] ,  4 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                1 ,  [ None ,  None ,  [ ] ] ,  None ,  None ,  None ,  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ] ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-16 14:28:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        challenge_results  =  req ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _CHALLENGE_URL ,  challenge_req , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' Logging in ' ,  ' Unable to log in ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-16 14:28:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  challenge_results  is  False : 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-16 14:28:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        login_res  =  try_get ( challenge_results ,  lambda  x :  x [ 0 ] [ 5 ] ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  login_res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            login_msg  =  try_get ( login_res ,  lambda  x :  x [ 5 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            warn ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' Unable to login:  %s '  %  ' Invalid password ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  login_msg  ==  ' INCORRECT_ANSWER_ENTERED '  else  login_msg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        res  =  try_get ( challenge_results ,  lambda  x :  x [ 0 ] [ - 1 ] ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            warn ( ' Unable to extract result entry ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        tfa  =  try_get ( res ,  lambda  x :  x [ 0 ] [ 0 ] ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  tfa : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            tfa_str  =  try_get ( tfa ,  lambda  x :  x [ 2 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  tfa_str  ==  ' TWO_STEP_VERIFICATION ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # SEND_SUCCESS - TFA code has been successfully sent to phone 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # QUOTA_EXCEEDED - reached the limit of TFA codes 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status  =  try_get ( tfa ,  lambda  x :  x [ 5 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  status  ==  ' QUOTA_EXCEEDED ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    warn ( ' Exceeded the limit of TFA codes, try later ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tl  =  try_get ( challenge_results ,  lambda  x :  x [ 1 ] [ 2 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  not  tl : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    warn ( ' Unable to extract TL ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tfa_code  =  self . _get_tfa_info ( ' 2-step verification code ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  not  tfa_code : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    warn ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' Two-factor authentication required. Provide it either interactively or with --twofactor <code> ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' (Note that only TOTP (Google Authenticator App) codes work at this time.) ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tfa_code  =  remove_start ( tfa_code ,  ' G- ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tfa_req  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    user_hash ,  None ,  2 ,  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        9 ,  None ,  None ,  None ,  None ,  None ,  None ,  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        [ None ,  tfa_code ,  True ,  2 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ] ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tfa_results  =  req ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    self . _TFA_URL . format ( tl ) ,  tfa_req , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' Submitting TFA code ' ,  ' Unable to submit TFA code ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  tfa_results  is  False : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tfa_res  =  try_get ( tfa_results ,  lambda  x :  x [ 0 ] [ 5 ] ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  tfa_res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    tfa_msg  =  try_get ( tfa_res ,  lambda  x :  x [ 5 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    warn ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' Unable to finish TFA:  %s '  %  ' Invalid TFA code ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  tfa_msg  ==  ' INCORRECT_ANSWER_ENTERED '  else  tfa_msg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                check_cookie_url  =  try_get ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    tfa_results ,  lambda  x :  x [ 0 ] [ - 1 ] [ 2 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            check_cookie_url  =  try_get ( res ,  lambda  x :  x [ 2 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  check_cookie_url : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            warn ( ' Unable to extract CheckCookie URL ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        check_cookie_results  =  self . _download_webpage ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            check_cookie_url ,  None ,  ' Checking cookie ' ,  fatal = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  check_cookie_results  is  False : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 04:19:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ' https://myaccount.google.com/ '  not  in  check_cookie_results : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            warn ( ' Unable to log in ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 23:58:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-02 00:57:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _download_webpage ( self ,  * args ,  * * kwargs ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        kwargs . setdefault ( ' query ' ,  { } ) [ ' disable_polymer ' ]  =  ' true ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  super ( YoutubeBaseInfoExtractor ,  self ) . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            * args ,  * * compat_kwargs ( kwargs ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _real_initialize ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  self . _downloader  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 00:03:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . _set_language ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  not  self . _login ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-08 08:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-31 17:49:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeEntryListBaseInfoExtractor ( YoutubeBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:01:01 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # Extract entries from page with "Load more" button 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-18 00:11:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _entries ( self ,  page ,  playlist_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        more_widget_html  =  content_html  =  page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  page_num  in  itertools . count ( 1 ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:01:01 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  entry  in  self . _process_page ( content_html ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                yield  entry 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-18 00:11:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            mobj  =  re . search ( r ' data-uix-load-more-href= " /?(?P<more>[^ " ]+) " ' ,  more_widget_html ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  mobj : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            more  =  self . _download_json ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' https://youtube.com/ %s '  %  mobj . group ( ' more ' ) ,  playlist_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' Downloading page # %s '  %  page_num , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                transform_source = uppercase_escape ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            content_html  =  more [ ' content_html ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  content_html . strip ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # Some webpages show a "Load more" button but they don't 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # have more videos 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            more_widget_html  =  more [ ' load_more_widget_html ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:01:01 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  YoutubePlaylistBaseInfoExtractor ( YoutubeEntryListBaseInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _process_page ( self ,  content ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  video_id ,  video_title  in  self . extract_videos_from_page ( content ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            yield  self . url_result ( video_id ,  ' Youtube ' ,  video_id ,  video_title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-18 00:11:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  extract_videos_from_page ( self ,  page ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ids_in_page  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        titles_in_page  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  mobj  in  re . finditer ( self . _VIDEO_RE ,  page ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # The link with index 0 is not the first video of the playlist (not sure if still actual) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ' index '  in  mobj . groupdict ( )  and  mobj . group ( ' id ' )  ==  ' 0 ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_id  =  mobj . group ( ' id ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_title  =  unescapeHTML ( mobj . group ( ' title ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  video_title : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_title  =  video_title . strip ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                idx  =  ids_in_page . index ( video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  video_title  and  not  titles_in_page [ idx ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    titles_in_page [ idx ]  =  video_title 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            except  ValueError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ids_in_page . append ( video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                titles_in_page . append ( video_title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  zip ( ids_in_page ,  titles_in_page ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:01:01 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubePlaylistsBaseInfoExtractor ( YoutubeEntryListBaseInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _process_page ( self ,  content ) : 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-26 20:42:18 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  playlist_id  in  orderedSet ( re . findall ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' <h3[^>]+class= " [^ " ]*yt-lockup-title[^ " ]* " [^>]*><a[^>]+href= " /?playlist \ ?list=([0-9A-Za-z-_] { 10,}) " ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content ) ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:01:01 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            yield  self . url_result ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' https://www.youtube.com/playlist?list= %s '  %  playlist_id ,  ' YoutubePlaylist ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 04:17:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        playlist_id  =  self . _match_id ( url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  playlist_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        title  =  self . _og_search_title ( webpage ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:01:01 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . playlist_result ( self . _entries ( webpage ,  playlist_id ) ,  playlist_id ,  title ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 04:17:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 21:44:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeIE ( YoutubeBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 16:42:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r """ (?x)^ 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                     ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-11 21:47:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         ( ? : https ? : / / | / / )                                     # http(s):// or protocol-independent URL 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 16:42:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         ( ? : ( ? : ( ? : ( ? : \w + \. ) ? [ yY ] [ oO ] [ uU ] [ tT ] [ uU ] [ bB ] [ eE ] ( ? : - nocookie ) ? \. com / | 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 02:53:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ( ? : www \. ) ? deturl \. com / www \. youtube \. com / | 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-10 01:30:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ( ? : www \. ) ? pwnyoutube \. com / | 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-07 21:59:04 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ( ? : www \. ) ? hooktube \. com / | 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-19 02:00:54 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ( ? : www \. ) ? yourepeat \. com / | 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-15 12:14:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            tube \. majestyc \. net / | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            youtube \. googleapis \. com / )                         # the various hostnames, with wildcard subdomains 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                         ( ? : . * ? \#/)?                                          # handle anchor (#/) redirect urls 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         ( ? :                                                   # the various things that can precede the ID: 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:34:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                             ( ? : ( ? : v | embed | e ) / ( ? ! videoseries ) )                 # v/ or embed/ or e/ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                             | ( ? :                                              # or the v= param in all its forms 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-19 02:00:54 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                 ( ? : ( ? : watch | movie ) ( ? : _popup ) ? ( ? : \. php ) ? / ? ) ?   # preceding watch(_popup|.php) or nothing (like /?v=xxxx) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                                 ( ? : \? | \#!?)                                  # the params delimiter ? or # or #! 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-29 21:01:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                 ( ? : . * ? [ & ; ] ) ? ?                                 # any other preceding param (like /?s=tuff&v=xxxx or ?s=tuff&v=V36LpHqtcDY) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                                 v = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 22:38:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-17 02:04:13 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         | ( ? : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            youtu \. be |                                         # just youtu.be/xxxx 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-04 02:26:20 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            vid \. plus |                                         # or vid.plus/xxxx 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            zwearz \. com / watch |                                 # or zwearz.com/watch/xxxx 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-17 02:04:13 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         ) / 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-11 21:47:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         | ( ? : www \. ) ? cleanvideosearch \. com / media / action / yt / watch \? videoId = 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 22:38:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                     ) ?                                                        # all until now is optional -> you can pass the naked ID 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-09 10:33:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                     ( [ 0 - 9 A - Za - z_ - ] { 11 } )                                       # here is it! the YouTube video ID 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-25 01:17:17 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                     ( ? ! . * ? \blist = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ( ? : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            % ( playlist_id ) s |                                   # combined list/video URLs are handled by the playlist IE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            WL                                                 # WL are handled by the watch later IE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                     ( ? ( 1 ) . + ) ?                                                 # if we found the ID, everything can follow 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-25 01:17:17 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                     $ """   %   { ' playlist_id ' : YoutubeBaseInfoExtractor._PLAYLIST_ID_RE} 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    _NEXT_URL_RE  =  r ' [ \ ?&]next_url=([^&]+) ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _formats  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 17:35:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 5 ' :  { ' ext ' :  ' flv ' ,  ' width ' :  400 ,  ' height ' :  240 ,  ' acodec ' :  ' mp3 ' ,  ' abr ' :  64 ,  ' vcodec ' :  ' h263 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 6 ' :  { ' ext ' :  ' flv ' ,  ' width ' :  450 ,  ' height ' :  270 ,  ' acodec ' :  ' mp3 ' ,  ' abr ' :  64 ,  ' vcodec ' :  ' h263 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 13 ' :  { ' ext ' :  ' 3gp ' ,  ' acodec ' :  ' aac ' ,  ' vcodec ' :  ' mp4v ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 17 ' :  { ' ext ' :  ' 3gp ' ,  ' width ' :  176 ,  ' height ' :  144 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  24 ,  ' vcodec ' :  ' mp4v ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 18 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  640 ,  ' height ' :  360 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  96 ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 22 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  1280 ,  ' height ' :  720 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 34 ' :  { ' ext ' :  ' flv ' ,  ' width ' :  640 ,  ' height ' :  360 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 35 ' :  { ' ext ' :  ' flv ' ,  ' width ' :  854 ,  ' height ' :  480 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-08 01:30:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # itag 36 videos are either 320x180 (BaW_jenozKc) or 320x240 (__2ABJjxzNo), abr varies as well 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 17:35:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 36 ' :  { ' ext ' :  ' 3gp ' ,  ' width ' :  320 ,  ' acodec ' :  ' aac ' ,  ' vcodec ' :  ' mp4v ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 37 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  1920 ,  ' height ' :  1080 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 38 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  4096 ,  ' height ' :  3072 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 43 ' :  { ' ext ' :  ' webm ' ,  ' width ' :  640 ,  ' height ' :  360 ,  ' acodec ' :  ' vorbis ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 44 ' :  { ' ext ' :  ' webm ' ,  ' width ' :  854 ,  ' height ' :  480 ,  ' acodec ' :  ' vorbis ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 45 ' :  { ' ext ' :  ' webm ' ,  ' width ' :  1280 ,  ' height ' :  720 ,  ' acodec ' :  ' vorbis ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 04:11:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 46 ' :  { ' ext ' :  ' webm ' ,  ' width ' :  1920 ,  ' height ' :  1080 ,  ' acodec ' :  ' vorbis ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 17:35:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 59 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  854 ,  ' height ' :  480 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 78 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  854 ,  ' height ' :  480 ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 04:11:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # 3D videos 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 17:35:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 82 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  360 ,  ' format_note ' :  ' 3D ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 83 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  480 ,  ' format_note ' :  ' 3D ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 84 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  720 ,  ' format_note ' :  ' 3D ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 85 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1080 ,  ' format_note ' :  ' 3D ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 04:11:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 100 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  360 ,  ' format_note ' :  ' 3D ' ,  ' acodec ' :  ' vorbis ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' vp8 ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 101 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' format_note ' :  ' 3D ' ,  ' acodec ' :  ' vorbis ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' vp8 ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 102 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  720 ,  ' format_note ' :  ' 3D ' ,  ' acodec ' :  ' vorbis ' ,  ' abr ' :  192 ,  ' vcodec ' :  ' vp8 ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 18:22:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-03 18:49:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Apple HTTP Live Streaming 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-17 19:25:37 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 91 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  144 ,  ' format_note ' :  ' HLS ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  48 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 17:35:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 92 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  240 ,  ' format_note ' :  ' HLS ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  48 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 93 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  360 ,  ' format_note ' :  ' HLS ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 94 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  480 ,  ' format_note ' :  ' HLS ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 95 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  720 ,  ' format_note ' :  ' HLS ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  256 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 96 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1080 ,  ' format_note ' :  ' HLS ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  256 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 04:11:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 132 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  240 ,  ' format_note ' :  ' HLS ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  48 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 151 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  72 ,  ' format_note ' :  ' HLS ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  24 ,  ' vcodec ' :  ' h264 ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # DASH mp4 video 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-11 22:41:48 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 133 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  240 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 134 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  360 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 135 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 136 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  720 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 137 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1080 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 138 ' :  { ' ext ' :  ' mp4 ' ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } ,   # Height can vary (https://github.com/rg3/youtube-dl/issues/4559) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 160 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  144 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 212 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 264 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1440 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 298 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  720 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' ,  ' fps ' :  60 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 299 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1080 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' ,  ' fps ' :  60 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 266 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  2160 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' h264 ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 18:22:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-18 18:53:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Dash mp4 audio 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-11 22:41:48 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 139 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  48 ,  ' container ' :  ' m4a_dash ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 140 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  128 ,  ' container ' :  ' m4a_dash ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 141 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' aac ' ,  ' abr ' :  256 ,  ' container ' :  ' m4a_dash ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 256 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' aac ' ,  ' container ' :  ' m4a_dash ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 258 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' aac ' ,  ' container ' :  ' m4a_dash ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 325 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' dtse ' ,  ' container ' :  ' m4a_dash ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 328 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' ec-3 ' ,  ' container ' :  ' m4a_dash ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 18:22:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Dash webm 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-11 22:41:48 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 167 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  360 ,  ' width ' :  640 ,  ' format_note ' :  ' DASH video ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 168 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' width ' :  854 ,  ' format_note ' :  ' DASH video ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 169 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  720 ,  ' width ' :  1280 ,  ' format_note ' :  ' DASH video ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 170 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  1080 ,  ' width ' :  1920 ,  ' format_note ' :  ' DASH video ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 218 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' width ' :  854 ,  ' format_note ' :  ' DASH video ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 219 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' width ' :  854 ,  ' format_note ' :  ' DASH video ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' vp8 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 278 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  144 ,  ' format_note ' :  ' DASH video ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 242 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  240 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 243 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  360 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 244 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 245 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 246 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 247 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  720 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 248 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  1080 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 271 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  1440 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-30 20:42:05 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug) 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-11 22:41:48 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 272 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  2160 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 302 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  720 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' ,  ' fps ' :  60 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 303 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  1080 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' ,  ' fps ' :  60 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 308 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  1440 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' ,  ' fps ' :  60 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 313 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  2160 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 315 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  2160 ,  ' format_note ' :  ' DASH video ' ,  ' vcodec ' :  ' vp9 ' ,  ' fps ' :  60 } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Dash webm audio 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-11 22:41:48 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 171 ' :  { ' ext ' :  ' webm ' ,  ' acodec ' :  ' vorbis ' ,  ' format_note ' :  ' DASH audio ' ,  ' abr ' :  128 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 172 ' :  { ' ext ' :  ' webm ' ,  ' acodec ' :  ' vorbis ' ,  ' format_note ' :  ' DASH audio ' ,  ' abr ' :  256 } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-09 02:38:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-18 11:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Dash webm audio with opus inside 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-11 22:41:48 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 249 ' :  { ' ext ' :  ' webm ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' opus ' ,  ' abr ' :  50 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 250 ' :  { ' ext ' :  ' webm ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' opus ' ,  ' abr ' :  70 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 251 ' :  { ' ext ' :  ' webm ' ,  ' format_note ' :  ' DASH audio ' ,  ' acodec ' :  ' opus ' ,  ' abr ' :  160 } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-18 11:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-09 02:38:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # RTMP (unnamed) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' _rtmp ' :  { ' protocol ' :  ' rtmp ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-06 06:44:38 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _SUBTITLE_FORMATS  =  ( ' ttml ' ,  ' vtt ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 18:22:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-26 16:51:21 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _GEO_BYPASS  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:13:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' BaW_jenozKc ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' youtube-dl test video  " \' / \\ ä↭𝕐 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' Philipp Hagemeister ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' phihag ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/phihag ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20121002 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' test chars:   " \' / \\ ä↭𝕐 \n test URL: https://github.com/rg3/youtube-dl/issues/1892 \n \n This is a test video for youtube-dl. \n \n For more information, contact phihag@phihag.de . ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' categories ' :  [ ' Science & Technology ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 03:43:32 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' tags ' :  [ ' youtube-dl ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  10 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-31 18:10:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' like_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' dislike_count ' :  int , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 21:10:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' start_time ' :  1 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-23 13:20:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' end_time ' :  9 , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:13:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:55:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=UxxajLWwzqY ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' note ' :  ' Test generic use_cipher_signature video (#897) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' UxxajLWwzqY ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20120506 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Icona Pop - I Love It (feat. Charli XCX) [OFFICIAL VIDEO] ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' alt_title ' :  ' I Love It (feat. Charli XCX) ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' md5:f3ceb5ef83a08d95b9d146f973157cc8 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 03:43:32 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' tags ' :  [ ' Icona Pop i love it ' ,  ' sweden ' ,  ' pop music ' ,  ' big beat records ' ,  ' big beat ' ,  ' charli ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         ' xcx ' ,  ' charli xcx ' ,  ' girls ' ,  ' hbo ' ,  ' i love it ' ,  " i don ' t care " ,  ' icona ' ,  ' pop ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         ' iconic ep ' ,  ' iconic ' ,  ' love ' ,  ' it ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  180 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' Icona Pop ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' IconaPop ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/IconaPop ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' creator ' :  ' Icona Pop ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:13:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=07FYdnEawAQ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' note ' :  ' Test VEVO video with age protection (#956) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' 07FYdnEawAQ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20130703 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Justin Timberlake - Tunnel Vision (Explicit) ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' alt_title ' :  ' Tunnel Vision ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' md5:64249768eec3bc4276236606ea996373 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  419 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' justintimberlakeVEVO ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' justintimberlakeVEVO ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/justintimberlakeVEVO ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' creator ' :  ' Justin Timberlake ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 01:24:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' age_limit ' :  18 , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 13:05:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' //www.YouTube.com/watch?v=yZIXLfi8CZQ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' note ' :  ' Embed-only video (#1746) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' yZIXLfi8CZQ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20120608 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Principal Sexually Assaults A Teacher - Episode 117 - 8th June 2012 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:09b78bd971f1e3e289601dfba15ca4f7 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' SET India ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:35:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' setindia ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/setindia ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:35:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' age_limit ' :  18 , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 13:05:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:52:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=BaW_jenozKc&v=UxxajLWwzqY ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:52:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' note ' :  ' Use the first video ID in the URL ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' BaW_jenozKc ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' youtube-dl test video  " \' / \\ ä↭𝕐 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' Philipp Hagemeister ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' phihag ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/phihag ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:52:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20121002 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:52:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' test chars:   " \' / \\ ä↭𝕐 \n test URL: https://github.com/rg3/youtube-dl/issues/1892 \n \n This is a test video for youtube-dl. \n \n For more information, contact phihag@phihag.de . ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' categories ' :  [ ' Science & Technology ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' tags ' :  [ ' youtube-dl ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  10 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:52:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' like_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' dislike_count ' :  int , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 01:22:06 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:52:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=a9LDPn-MO4I ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' note ' :  ' 256k DASH audio (format 141) via DASH manifest ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' a9LDPn-MO4I ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' m4a ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20121002 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' 8KVIDEO ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/8KVIDEO ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' 8KVIDEO ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' title ' :  ' UHDTV TEST 8K VIDEO.mp4 ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-22 21:56:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' youtube_include_dash_manifest ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' format ' :  ' 141 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-22 21:56:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:27:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' skip ' :  ' format 141 not served anymore ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 15:15:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # DASH manifest with encrypted signature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=IB3lcPjvWLA ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' IB3lcPjvWLA ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' m4a ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 19:18:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' title ' :  ' Afrojack, Spree Wilson - The Spark ft. Spree Wilson ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:12e7067fa6735a77bdcbb58cb1187d2d ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  244 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' AfrojackVEVO ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' AfrojackVEVO ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20131011 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 15:15:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' youtube_include_dash_manifest ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:27:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' format ' :  ' 141/bestaudio[ext=m4a] ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 15:15:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-16 01:25:03 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # JS player signature function name containing $ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=nfWlot6h_JM ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' nfWlot6h_JM ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' m4a ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Taylor Swift - Shake It Off ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' alt_title ' :  ' Shake It Off ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 21:27:58 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' md5:95f66187cd7c8b2c13eb78e1223b63c3 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  242 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-16 01:25:03 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' TaylorSwiftVEVO ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' TaylorSwiftVEVO ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20140818 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' creator ' :  ' Taylor Swift ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-16 01:25:03 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' youtube_include_dash_manifest ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:27:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' format ' :  ' 141/bestaudio[ext=m4a] ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-16 01:25:03 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 09:59:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Controversy video 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=T4XJQO3qol8 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' T4XJQO3qol8 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  219 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 09:59:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20100909 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' The Amazing Atheist ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' TheAmazingAtheist ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/TheAmazingAtheist ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 09:59:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' title ' :  ' Burning Everyone \' s Koran ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' SUBSCRIBE: http://www.youtube.com/saturninefilms \n \n 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 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 21:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Normal age-gate video (No vevo, embed allowed) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://youtube.com/watch?v=HtVdAasjOgU ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 21:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' HtVdAasjOgU ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' The Witcher 3: Wild Hunt - The Sword Of Destiny Trailer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  r ' re:(?s). { 100,}About the Game \ n.*?The Witcher 3: Wild Hunt. { 100,} ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  142 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 21:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' The Witcher ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' WitcherGame ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/WitcherGame ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 21:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20140605 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 01:24:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' age_limit ' :  18 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 21:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-30 17:26:21 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Age-gate video with encrypted signature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=6kLq3WMV1nU ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-30 17:26:21 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' 6kLq3WMV1nU ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Dedication To My Ex (Miss That) (Lyric Video) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:33765bb339e1b47e7e72b5490139bb41 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  247 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-30 17:26:21 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' LloydVEVO ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' LloydVEVO ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/LloydVEVO ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-30 17:26:21 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20110629 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 01:24:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' age_limit ' :  18 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-30 17:26:21 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 13:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # video_info is None (https://github.com/rg3/youtube-dl/issues/4421) 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-14 22:37:04 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # YouTube Red ad is not captured for creator 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 13:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' __2ABJjxzNo ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' __2ABJjxzNo ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  266 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 13:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20100430 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' deadmau5 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/deadmau5 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' creator ' :  ' deadmau5 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 13:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' md5:12c56784b8032162bb936a5f76d55360 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' deadmau5 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 13:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' title ' :  ' Deadmau5 - Some Chords (HD) ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' alt_title ' :  ' Some Chords ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 13:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' expected_warnings ' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' DASH manifest missing ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 16:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Olympics (https://github.com/rg3/youtube-dl/issues/4431) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' lqQg6PlCWgI ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' lqQg6PlCWgI ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  6085 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:37:21 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20150827 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 16:34:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' olympic ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/olympic ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 16:34:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' HO09  - Women -  GER-AUS - Hockey - 31 July 2012 - London 2012 Olympic Games ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:47:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' Olympic ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 16:34:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' title ' :  ' Hockey - Women -  GER-AUS - London 2012 Olympic Games ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  ' requires avconv ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 16:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 16:34:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 05:45:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Non-square pixels 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=_b-2C3KPAM0 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' _b-2C3KPAM0 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' stretched_ratio ' :  16  /  9. , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  85 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 05:45:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20110310 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' AllenMeow ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/AllenMeow ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 05:45:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' made by Wacom from Korea | 字幕&加油添醋 by TY \' s Allen | 感謝heylisa00cavey1001同學熱情提供梗及翻譯 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' 孫艾倫 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 05:45:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' title ' :  ' [A-made] 變態妍字幕版 太妍 我就是這樣的人 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-06 00:35:55 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # url_encoded_fmt_stream_map is empty string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' qEJwOuvDf7I ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' qEJwOuvDf7I ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 21:27:58 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' ext ' :  ' webm ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-06 00:35:55 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' title ' :  ' Обсуждение судебной практики по выборам 14 сентября 2014 года в Санкт-Петербурге ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20150404 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' spbelect ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' Наблюдатели Петербурга ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  ' requires avconv ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-19 20:56:04 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' skip ' :  ' This live event has ended. ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-06 00:35:55 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 14:55:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Extraction from multiple DASH manifests (https://github.com/rg3/youtube-dl/pull/6097) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=FIl7x6_3R5Y ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' FIl7x6_3R5Y ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' md5:7b81415841e02ecd4313668cde88737a ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:116377fd2963b81ec4ce64b542173306 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  220 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 14:55:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20150625 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' dorappi2000 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/dorappi2000 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 14:55:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' dorappi2000 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:47:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' formats ' :  ' mincount:32 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 14:55:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 19:34:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-10 14:47:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # DASH manifest with segment_list 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/embed/CsmdDsKjzN8 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' md5 ' :  ' 8ce563a1d667b599d21064e982ab9e31 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' CsmdDsKjzN8 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 19:48:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20150501 ' ,   # According to '<meta itemprop="datePublished"', but in other places it's 20150510 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-10 14:47:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' Airtek ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' Retransmisión en directo de la XVIII media maratón de Zaragoza. ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' UCzTzUmjXxxacNnL8I3m4LnQ ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-10 14:47:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' title ' :  ' Retransmisión XVIII Media maratón Zaragoza 2015 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' youtube_include_dash_manifest ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' format ' :  ' 135 ' ,   # bestvideo 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:47:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' skip ' :  ' This live event has ended. ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 19:34:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Multifeed videos (multiple cameras), URL is for Main Camera 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=jqWvoWXjCVs ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' jqWvoWXjCVs ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' teamPGP: Rocket League Noob Stream ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:dc7872fb300e143831327f1bae3af010 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' playlist ' :  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' id ' :  ' jqWvoWXjCVs ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' title ' :  ' teamPGP: Rocket League Noob Stream (Main Camera) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' description ' :  ' md5:dc7872fb300e143831327f1bae3af010 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' duration ' :  7335 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' upload_date ' :  ' 20150721 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' uploader ' :  ' Beer Games Beer ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' uploader_id ' :  ' beergamesbeer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/beergamesbeer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' id ' :  ' 6h8e8xoXJzg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' title ' :  ' teamPGP: Rocket League Noob Stream (kreestuh) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' description ' :  ' md5:dc7872fb300e143831327f1bae3af010 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' duration ' :  7337 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' upload_date ' :  ' 20150721 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' uploader ' :  ' Beer Games Beer ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' uploader_id ' :  ' beergamesbeer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/beergamesbeer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' id ' :  ' PUOgX5z9xZw ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' title ' :  ' teamPGP: Rocket League Noob Stream (grizzle) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' description ' :  ' md5:dc7872fb300e143831327f1bae3af010 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' duration ' :  7337 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' upload_date ' :  ' 20150721 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' uploader ' :  ' Beer Games Beer ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' uploader_id ' :  ' beergamesbeer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/beergamesbeer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' id ' :  ' teuwxikvS5k ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' title ' :  ' teamPGP: Rocket League Noob Stream (zim) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' description ' :  ' md5:dc7872fb300e143831327f1bae3af010 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' duration ' :  7334 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' upload_date ' :  ' 20150721 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' uploader ' :  ' Beer Games Beer ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' uploader_id ' :  ' beergamesbeer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/beergamesbeer ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-17 02:04:13 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 05:18:58 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Multifeed video with comma in title (see https://github.com/rg3/youtube-dl/issues/8536) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=gVfLd0zydlo ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' gVfLd0zydlo ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' DevConf.cz 2016 Day 2 Workshops 1 14:00 - 15:30 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' playlist_count ' :  2 , 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:47:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' skip ' :  ' Not multifeed anymore ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 05:18:58 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-17 02:04:13 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://vid.plus/FlRa-iH7PGw ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-17 02:04:13 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 13:49:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-04 02:26:20 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://zwearz.com/watch/9lWxNJF-ufM/electra-woman-dyna-girl-official-trailer-grace-helbig.html ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-04 02:26:20 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' only_matching ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 13:49:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:02:37 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Title with JS-like syntax "};" (see https://github.com/rg3/youtube-dl/issues/7468) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-18 23:19:38 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Also tests cut-off URL expansion in video description (see 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # https://github.com/rg3/youtube-dl/issues/1892, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # https://github.com/rg3/youtube-dl/issues/8164) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 13:49:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=lsguqyKfVQg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' lsguqyKfVQg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' { dark walk}; Loki/AC/Dishonored; collab w/Elflover21 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' alt_title ' :  ' Dark Walk ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 13:49:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' md5:8085699c11dc3f597ce0410b0dcbb34a ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  133 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 13:49:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20151119 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' IronSoulElf ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/IronSoulElf ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 13:49:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' IronSoulElf ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' creator ' :  ' Todd Haberman, Daniel Law Heath & Aaron Kaplan ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 13:49:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:02:37 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Tags with '};' (see https://github.com/rg3/youtube-dl/issues/7468) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=Ms7iBXnlUO8 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' only_matching ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-28 01:07:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Video with yt:stretch=17:0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=Q39EVAstoRM ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' Q39EVAstoRM ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Clash Of Clans#14 Dicas De Ataque Para CV 4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:ee18a25c350637c8faff806845bddee9 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20151107 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' UCCr7TALkRbo3EtFzETQF1LA ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' CH GAMER DROID ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:47:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' skip ' :  ' This video does not exist. ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-28 01:07:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Video licensed under Creative Commons 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=M4gD1WSo5mA ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' M4gD1WSo5mA ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' md5:e41008789470fc2533a3252216f1c1d1 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:a677553cf0840649b731a3024aeff4cc ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  721 , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20150127 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' BerkmanCenter ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/BerkmanCenter ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader ' :  ' The Berkman Klein Center for Internet & Society ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Creative Commons Attribution license (reuse allowed) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:49:10 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Channel-like uploader_url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=eQcmzGIKrzg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' eQcmzGIKrzg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Democratic Socialism and Foreign Policy | Bernie Sanders ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:dda0d780d5a6e120758d1711d062a867 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' duration ' :  4060 , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:49:10 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20151119 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' Bernie 2016 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' UCH1dpzjCEiGAt8CXkryhkZg ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/channel/UCH1dpzjCEiGAt8CXkryhkZg ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:49:10 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Creative Commons Attribution license (reuse allowed) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-29 21:01:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?feature=player_embedded&amp;v=V36LpHqtcDY ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-12 02:10:35 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # YouTube Red paid video (https://github.com/rg3/youtube-dl/issues/10059) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=i1Ko8UG-Tdo ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 01:17:15 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Rental video preview 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=yYr8q0y5Jfg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' uGpuVWrhIzE ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Piku - Trailer ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:c36bd60c3fd6f1954086c083c72092eb ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20150811 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' FlixMatrix ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' FlixMatrixKaravan ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/FlixMatrixKaravan ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 01:17:15 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-09 22:30:46 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-21 18:10:32 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # YouTube Red video with episode data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=iqKdEhx-dD4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' iqKdEhx-dD4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Isolation - Mind Field (Ep 1) ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' description ' :  ' md5:8013b7ddea787342608f63a13ddc9492 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' duration ' :  2085 , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-21 18:10:32 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20170118 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' Vsauce ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' Vsauce ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/Vsauce ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' series ' :  ' Mind Field ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' season_number ' :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' episode_number ' :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' expected_warnings ' :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' Skipping DASH manifest ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 15:38:38 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # The following content has been identified by the YouTube community 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # as inappropriate or offensive to some audiences. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=6SJNVb0GnPI ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' 6SJNVb0GnPI ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Race Differences in Intelligence ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' md5:5d161533167390427a1f8ee89a1fc6f1 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' duration ' :  965 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20140124 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' New Century Foundation ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_id ' :  ' UCEJYpZGqgUob0zVVEaLhvVg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/channel/UCEJYpZGqgUob0zVVEaLhvVg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' view_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-09 22:30:46 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # itag 212 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' 1t24XAntNCY ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-26 16:51:21 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # geo restricted to JP 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' sJL6WA-aGkQ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' only_matching ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-25 01:17:17 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  ' https://www.youtube.com/watch?v=MuAGGZNfUkU&list=RDMM ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' only_matching ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:13:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  __init__ ( self ,  * args ,  * * kwargs ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        super ( YoutubeIE ,  self ) . __init__ ( * args ,  * * kwargs ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . _player_cache  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  report_video_info_webpage_download ( self ,  video_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Report attempt to download video info webpage. """ 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . to_screen ( ' %s : Downloading video info webpage '  %  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  report_information_extraction ( self ,  video_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Report attempt to extract video information. """ 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . to_screen ( ' %s : Extracting video information '  %  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  report_unavailable_format ( self ,  video_id ,  format ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Report extracted video URL. """ 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . to_screen ( ' %s : Format  %s  not available '  %  ( video_id ,  format ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  report_rtmp_download ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Indicate the download will use the RTMP protocol. """ 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . to_screen ( ' RTMP download detected ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:21:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _signature_cache_id ( self ,  example_sig ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """  Return a string representation of a signature  """ 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ' . ' . join ( compat_str ( len ( part ) )  for  part  in  example_sig . split ( ' . ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:21:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _extract_signature_function ( self ,  video_id ,  player_url ,  example_sig ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-17 16:28:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        id_m  =  re . match ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-28 15:47:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' .*?-(?P<id>[a-zA-Z0-9_-]+)(?:/watch_as3|/html5player(?:-new)?|(?:/[a-z] {2} _[A-Z] {2} )?/base)? \ .(?P<ext>[a-z]+)$ ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-17 16:28:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            player_url ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 02:19:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  not  id_m : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( ' Cannot identify player  %r '  %  player_url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        player_type  =  id_m . group ( ' ext ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        player_id  =  id_m . group ( ' id ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Read from filesystem cache 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:21:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        func_id  =  ' %s _ %s _ %s '  %  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            player_type ,  player_id ,  self . _signature_cache_id ( example_sig ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        assert  os . path . basename ( func_id )  ==  func_id 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-03 12:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        cache_spec  =  self . _downloader . cache . load ( ' youtube-sigfuncs ' ,  func_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-03 12:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  cache_spec  is  not  None : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  lambda  s :  ' ' . join ( s [ i ]  for  i  in  cache_spec ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-18 10:39:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        download_note  =  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' Downloading player  %s '  %  player_url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  self . _downloader . params . get ( ' verbose ' )  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' Downloading  %s  player  %s '  %  ( player_type ,  player_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  player_type  ==  ' js ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            code  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                player_url ,  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-18 10:39:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                note = download_note , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                errnote = ' Download of  %s  failed '  %  player_url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            res  =  self . _parse_sig_js ( code ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  player_type  ==  ' swf ' : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            urlh  =  self . _request_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                player_url ,  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-18 10:39:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                note = download_note , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                errnote = ' Download of  %s  failed '  %  player_url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            code  =  urlh . read ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            res  =  self . _parse_sig_swf ( code ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            assert  False ,  ' Invalid player type  %r '  %  player_type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-18 10:42:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        test_string  =  ' ' . join ( map ( compat_chr ,  range ( len ( example_sig ) ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cache_res  =  res ( test_string ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cache_spec  =  [ ord ( c )  for  c  in  cache_res ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . _downloader . cache . store ( ' youtube-sigfuncs ' ,  func_id ,  cache_spec ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  res 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:21:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _print_sig_code ( self ,  func ,  example_sig ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  gen_sig_code ( idxs ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            def  _genslice ( start ,  end ,  step ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                starts  =  ' '  if  start  ==  0  else  str ( start ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ends  =  ( ' : %d '  %  ( end  +  step ) )  if  end  +  step  > =  0  else  ' : ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                steps  =  ' '  if  step  ==  1  else  ( ' : %d '  %  step ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  ' s[ %s %s %s ] '  %  ( starts ,  ends ,  steps ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            step  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-17 00:06:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Quelch pyflakes warnings - start will be set when step is set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            start  =  ' (Never used) ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  i ,  prev  in  zip ( idxs [ 1 : ] ,  idxs [ : - 1 ] ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  step  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  i  -  prev  ==  step : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    yield  _genslice ( start ,  prev ,  step ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    step  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  i  -  prev  in  [ - 1 ,  1 ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    step  =  i  -  prev 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    start  =  prev 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    yield  ' s[ %d ] '  %  prev 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  step  is  None : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                yield  ' s[ %d ] '  %  i 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                yield  _genslice ( start ,  i ,  step ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        test_string  =  ' ' . join ( map ( compat_chr ,  range ( len ( example_sig ) ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 12:18:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        cache_res  =  func ( test_string ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        cache_spec  =  [ ord ( c )  for  c  in  cache_res ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        expr_code  =  '  +  ' . join ( gen_sig_code ( cache_spec ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:21:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        signature_id_tuple  =  ' ( %s ) '  %  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ,  ' . join ( compat_str ( len ( p ) )  for  p  in  example_sig . split ( ' . ' ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        code  =  ( ' if tuple(len(p) for p in s.split( \' . \' )) ==  %s : \n ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                '     return  %s \n ' )  %  ( signature_id_tuple ,  expr_code ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . to_screen ( ' Extracted signature function: \n '  +  code ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _parse_sig_js ( self ,  jscode ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        funcname  =  self . _search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-31 22:19:29 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ( r ' ([ " \' ])signature \ 1 \ s*, \ s*(?P<sig>[a-zA-Z0-9$]+) \ ( ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								             r ' \ .sig \ | \ |(?P<sig>[a-zA-Z0-9$]+) \ ( ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            jscode ,  ' Initial JS player signature function name ' ,  group = ' sig ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 07:02:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        jsi  =  JSInterpreter ( jscode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        initial_function  =  jsi . extract_function ( funcname ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  lambda  s :  initial_function ( [ s ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _parse_sig_swf ( self ,  file_contents ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-18 10:24:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        swfi  =  SWFInterpreter ( file_contents ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        TARGET_CLASSNAME  =  ' SignatureDecipher ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-18 10:24:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        searched_class  =  swfi . extract_class ( TARGET_CLASSNAME ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        initial_function  =  swfi . extract_function ( searched_class ,  ' decipher ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  lambda  s :  initial_function ( [ s ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _decrypt_signature ( self ,  s ,  video_id ,  player_url ,  age_gate = False ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 22:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        """ Turn the encrypted s field into a working signature """ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 01:51:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-11 10:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  player_url  is  None : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            raise  ExtractorError ( ' Cannot decrypt signature without player_url ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-27 06:15:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  player_url . startswith ( ' // ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            player_url  =  ' https: '  +  player_url 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-31 22:19:29 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  not  re . match ( r ' https?:// ' ,  player_url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            player_url  =  compat_urlparse . urljoin ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' https://www.youtube.com ' ,  player_url ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-11 10:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:23:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            player_id  =  ( player_url ,  self . _signature_cache_id ( s ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-11 10:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  player_id  not  in  self . _player_cache : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                func  =  self . _extract_signature_function ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:21:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    video_id ,  player_url ,  s 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-11 10:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . _player_cache [ player_id ]  =  func 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            func  =  self . _player_cache [ player_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  self . _downloader . params . get ( ' youtube_print_sig_code ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:21:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                self . _print_sig_code ( func ,  s ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-11 10:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  func ( s ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            tb  =  traceback . format_exc ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' Signature extraction failed:  '  +  tb ,  cause = e ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 21:44:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _get_subtitles ( self ,  video_id ,  webpage ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-31 15:44:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            subs_doc  =  self . _download_xml ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 17:11:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' https://video.google.com/timedtext?hl=en&type=list&v= %s '  %  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 16:24:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                video_id ,  note = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  ExtractorError  as  err : 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-20 07:00:39 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( ' unable to download video subtitles:  %s '  %  error_to_compat_str ( err ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sub_lang_list  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-31 15:44:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  track  in  subs_doc . findall ( ' track ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            lang  =  track . attrib [ ' lang_code ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 10:56:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  lang  in  sub_lang_list : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 21:44:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            sub_formats  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-06 06:44:38 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  ext  in  self . _SUBTITLE_FORMATS : 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-26 01:46:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                params  =  compat_urllib_parse_urlencode ( { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 21:44:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' lang ' :  lang , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' v ' :  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' fmt ' :  ext , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' name ' :  track . attrib [ ' name ' ] . encode ( ' utf-8 ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sub_formats . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' url ' :  ' https://www.youtube.com/api/timedtext? '  +  params , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' ext ' :  ext , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sub_lang_list [ lang ]  =  sub_formats 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  not  sub_lang_list : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( ' video doesn \' t have subtitles ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  sub_lang_list 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:00:06 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _get_ytplayer_config ( self ,  video_id ,  webpage ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        patterns  =  ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:14:03 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # User data may contain arbitrary character sequences that may affect 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # JSON extraction with regex, e.g. when '};' is contained the second 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # regex won't capture the whole JSON. Yet working around by trying more 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # concrete regex first keeping in mind proper quoted string handling 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # to be implemented in future that will replace this workaround (see 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # https://github.com/rg3/youtube-dl/issues/7468, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # https://github.com/rg3/youtube-dl/pull/7599) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:00:06 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' ;ytplayer \ .config \ s*= \ s*( { .+?});ytplayer ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r ' ;ytplayer \ .config \ s*= \ s*( { .+?}); ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        config  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            patterns ,  webpage ,  ' ytplayer.config ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  config : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  self . _parse_json ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                uppercase_escape ( config ) ,  video_id ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 13:49:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 21:44:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _get_automatic_captions ( self ,  video_id ,  webpage ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        """ We need the webpage for getting the captions url, pass it as an 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           argument  to  speed  up  the  process . """ 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . to_screen ( ' %s : Looking for automatic captions '  %  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:00:06 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        player_config  =  self . _get_ytplayer_config ( video_id ,  webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        err_msg  =  ' Couldn \' t find automatic captions for  %s '  %  video_id 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:00:06 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  not  player_config : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( err_msg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-26 12:41:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            args  =  player_config [ ' args ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-26 22:21:47 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            caption_url  =  args . get ( ' ttsurl ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  caption_url : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                timestamp  =  args [ ' timestamp ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # We get the available subtitles 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-26 01:46:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                list_params  =  compat_urllib_parse_urlencode ( { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-26 22:21:47 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' type ' :  ' list ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' tlangs ' :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' asrs ' :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                list_url  =  caption_url  +  ' & '  +  list_params 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                caption_list  =  self . _download_xml ( list_url ,  video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                original_lang_node  =  caption_list . find ( ' track ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  original_lang_node  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    self . _downloader . report_warning ( ' Video doesn \' t have automatic captions ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                original_lang  =  original_lang_node . attrib [ ' lang_code ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                caption_kind  =  original_lang_node . attrib . get ( ' kind ' ,  ' ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sub_lang_list  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  lang_node  in  caption_list . findall ( ' target ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sub_lang  =  lang_node . attrib [ ' lang_code ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sub_formats  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    for  ext  in  self . _SUBTITLE_FORMATS : 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-26 01:46:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        params  =  compat_urllib_parse_urlencode ( { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-26 22:21:47 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ' lang ' :  original_lang , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' tlang ' :  sub_lang , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' fmt ' :  ext , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' ts ' :  timestamp , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' kind ' :  caption_kind , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        sub_formats . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' url ' :  caption_url  +  ' & '  +  params , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' ext ' :  ext , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sub_lang_list [ sub_lang ]  =  sub_formats 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  sub_lang_list 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:00:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            def  make_captions ( sub_url ,  sub_langs ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parsed_sub_url  =  compat_urllib_parse_urlparse ( sub_url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                caption_qs  =  compat_parse_qs ( parsed_sub_url . query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                captions  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  sub_lang  in  sub_langs : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sub_formats  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    for  ext  in  self . _SUBTITLE_FORMATS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        caption_qs . update ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' tlang ' :  [ sub_lang ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' fmt ' :  [ ext ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        sub_url  =  compat_urlparse . urlunparse ( parsed_sub_url . _replace ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            query = compat_urllib_parse_urlencode ( caption_qs ,  True ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        sub_formats . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' url ' :  sub_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' ext ' :  ext , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    captions [ sub_lang ]  =  sub_formats 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  captions 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # New captions format as of 22.06.2017 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            player_response  =  args . get ( ' player_response ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  player_response  and  isinstance ( player_response ,  compat_str ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                player_response  =  self . _parse_json ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    player_response ,  video_id ,  fatal = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  player_response : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    renderer  =  player_response [ ' captions ' ] [ ' playerCaptionsTracklistRenderer ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    base_url  =  renderer [ ' captionTracks ' ] [ 0 ] [ ' baseUrl ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sub_lang_list  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    for  lang  in  renderer [ ' translationLanguages ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        lang_code  =  lang . get ( ' languageCode ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  lang_code : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            sub_lang_list . append ( lang_code ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  make_captions ( base_url ,  sub_lang_list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-26 22:21:47 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Some videos don't provide ttsurl but rather caption_tracks and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # caption_translation_languages (e.g. 20LmZk1hakA) 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:00:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Does not used anymore as of 22.06.2017 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-26 22:21:47 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            caption_tracks  =  args [ ' caption_tracks ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            caption_translation_languages  =  args [ ' caption_translation_languages ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            caption_url  =  compat_parse_qs ( caption_tracks . split ( ' , ' ) [ 0 ] ) [ ' u ' ] [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:00:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            sub_lang_list  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-26 22:21:47 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  lang  in  caption_translation_languages . split ( ' , ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                lang_qs  =  compat_parse_qs ( compat_urllib_parse_unquote_plus ( lang ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sub_lang  =  lang_qs . get ( ' lc ' ,  [ None ] ) [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:00:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  sub_lang : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sub_lang_list . append ( sub_lang ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  make_captions ( caption_url ,  sub_lang_list ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # An extractor error can be raise by the download process if there are 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # no automatic captions but there are subtitles 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:00:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        except  ( KeyError ,  IndexError ,  ExtractorError ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( err_msg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-01 01:01:33 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _mark_watched ( self ,  video_id ,  video_info ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        playback_url  =  video_info . get ( ' videostats_playback_base_url ' ,  [ None ] ) [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  playback_url : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        parsed_playback_url  =  compat_urlparse . urlparse ( playback_url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qs  =  compat_urlparse . parse_qs ( parsed_playback_url . query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # cpn generation algorithm is reverse engineered from base.js. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # In fact it works even with dummy cpn. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        CPN_ALPHABET  =  ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cpn  =  ' ' . join ( ( CPN_ALPHABET [ random . randint ( 0 ,  256 )  &  63 ]  for  _  in  range ( 0 ,  16 ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qs . update ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ver ' :  [ ' 2 ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' cpn ' :  [ cpn ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        playback_url  =  compat_urlparse . urlunparse ( 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-26 01:46:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            parsed_playback_url . _replace ( query = compat_urllib_parse_urlencode ( qs ,  True ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-01 01:01:33 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            playback_url ,  video_id ,  ' Marking watched ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' Unable to mark watched ' ,  fatal = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-06 00:48:37 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @staticmethod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _extract_urls ( webpage ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Embedded YouTube player 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        entries  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            unescapeHTML ( mobj . group ( ' url ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  mobj  in  re . finditer ( r ''' (?x) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( ? : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < iframe [ ^ > ] + ? src = | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                data - video - url = | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < embed [ ^ > ] + ? src = | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                embedSWF \( ? : \s * | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < object [ ^ > ] + data = | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                new \s + SWFObject \( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( [ " \' ]) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( ? P < url > ( ? : https ? : ) ? / / ( ? : www \. ) ? youtube ( ? : - nocookie ) ? \. com / 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-27 22:26:43 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ( ? : embed | v | p ) / [ 0 - 9 A - Za - z_ - ] { 11 } . * ? ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-06 00:48:37 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            \1 ''' , webpage)] 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # lazyYT YouTube embed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        entries . extend ( list ( map ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            unescapeHTML , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            re . findall ( r ' class= " lazyYT "  data-youtube-id= " ([^ " ]+) " ' ,  webpage ) ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Wordpress "YouTube Video Importer" plugin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        matches  =  re . findall ( r ''' (?x)<div[^>]+ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            class = ( ? P < q1 > [ \' " ])[^ \' " ]* \b yvii_single_video_player \b [^ \' " ]*(?P=q1)[^>]+ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data - video_id = ( ? P < q2 > [ \' " ])([^ \' " ]+)(?P=q2) ' ' ' ,  webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        entries . extend ( m [ - 1 ]  for  m  in  matches ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  entries 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @staticmethod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _extract_url ( webpage ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        urls  =  YoutubeIE . _extract_urls ( webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  urls [ 0 ]  if  urls  else  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-08 19:20:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @classmethod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  extract_id ( cls ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( cls . _VALID_URL ,  url ,  re . VERBOSE ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            raise  ExtractorError ( ' Invalid URL:  %s '  %  url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        video_id  =  mobj . group ( 2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  video_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-14 16:18:58 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _extract_annotations ( self ,  video_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  ' https://www.youtube.com/annotations_invideo?features=1&legacy=1&video_id= %s '  %  video_id 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . _download_webpage ( url ,  video_id ,  note = ' Searching for annotations. ' ,  errnote = ' Unable to download video annotations. ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-14 16:18:58 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 02:27:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @staticmethod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _extract_chapters ( description ,  duration ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  description : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        chapter_lines  =  re . findall ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r ' (?:^|<br \ s*/>)([^<]*<a[^>]+onclick=[ " \' ]yt \ .www \ .watch \ .player \ .seekTo[^>]+>( \ d { 1,2}: \ d { 1,2}(?:: \ d { 1,2})?)</a>[^>]*)(?=$|<br \ s*/>) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            description ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  chapter_lines : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        chapters  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  next_num ,  ( chapter_line ,  time_point )  in  enumerate ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                chapter_lines ,  start = 1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            start_time  =  parse_duration ( time_point ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  start_time  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-01 23:29:45 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  start_time  >  duration : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 02:27:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            end_time  =  ( duration  if  next_num  ==  len ( chapter_lines ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        else  parse_duration ( chapter_lines [ next_num ] [ 1 ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  end_time  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-01 23:29:45 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  end_time  >  duration : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                end_time  =  duration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  start_time  >  end_time : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 02:27:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            chapter_title  =  re . sub ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' <a[^>]+>[^<]+</a> ' ,  ' ' ,  chapter_line ) . strip ( '   \t - ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            chapter_title  =  re . sub ( r ' \ s+ ' ,  '   ' ,  chapter_title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            chapters . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' start_time ' :  start_time , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' end_time ' :  end_time , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  chapter_title , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  chapters 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url ,  smuggled_data  =  unsmuggle_url ( url ,  { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        proto  =  ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' http '  if  self . _downloader . params . get ( ' prefer_insecure ' ,  False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else  ' https ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 21:10:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        start_time  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-23 13:20:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        end_time  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 21:10:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parsed_url  =  compat_urllib_parse_urlparse ( url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  component  in  [ parsed_url . fragment ,  parsed_url . query ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            query  =  compat_parse_qs ( component ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-23 13:20:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  start_time  is  None  and  ' t '  in  query : 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 21:10:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                start_time  =  parse_duration ( query [ ' t ' ] [ 0 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-23 13:21:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  start_time  is  None  and  ' start '  in  query : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                start_time  =  parse_duration ( query [ ' start ' ] [ 0 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-23 13:20:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  end_time  is  None  and  ' end '  in  query : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                end_time  =  parse_duration ( query [ ' end ' ] [ 0 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 21:10:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # Extract original video URL from URL with redirection, like age verification, using next_url parameter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . search ( self . _NEXT_URL_RE ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  mobj : 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-17 23:51:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            url  =  proto  +  ' ://www.youtube.com/ '  +  compat_urllib_parse_unquote ( mobj . group ( 1 ) ) . lstrip ( ' / ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-08 19:20:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_id  =  self . extract_id ( url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Get video webpage 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 09:59:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url  =  proto  +  ' ://www.youtube.com/watch?v= %s &gl=US&hl=en&has_verified=1&bpctr=9999999999 '  %  video_id 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-29 02:04:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_webpage  =  self . _download_webpage ( url ,  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Attempt to extract SWF player URL 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        mobj  =  re . search ( r ' swfConfig.*? " (https?: \\ / \\ /.*?watch.*?-.*? \ .swf) " ' ,  video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            player_url  =  re . sub ( r ' \\ (.) ' ,  r ' \ 1 ' ,  mobj . group ( 1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            player_url  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 00:36:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        dash_mpds  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  add_dash_mpd ( video_info ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            dash_mpd  =  video_info . get ( ' dashmpd ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  dash_mpd  and  dash_mpd [ 0 ]  not  in  dash_mpds : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dash_mpds . append ( dash_mpd [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 15:38:38 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        is_live  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        view_count  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  extract_view_count ( v_info ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  int_or_none ( try_get ( v_info ,  lambda  x :  x [ ' view_count ' ] [ 0 ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # Get video info 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-30 04:43:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        embed_webpage  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  re . search ( r ' player-age-gate-content " > ' ,  video_webpage )  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            age_gate  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # We simulate the access to the video from www.youtube.com/v/{video_id} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # this can be viewed without login into Youtube 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-29 22:58:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            url  =  proto  +  ' ://www.youtube.com/embed/ %s '  %  video_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            embed_webpage  =  self . _download_webpage ( url ,  video_id ,  ' Downloading embed webpage ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-26 01:46:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            data  =  compat_urllib_parse_urlencode ( { 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-20 21:05:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' video_id ' :  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' eurl ' :  ' https://youtube.googleapis.com/v/ '  +  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 12:16:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' sts ' :  self . _search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-29 22:58:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    r ' " sts " \ s*: \ s*( \ d+) ' ,  embed_webpage ,  ' sts ' ,  default = ' ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-20 21:05:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_info_url  =  proto  +  ' ://www.youtube.com/get_video_info? '  +  data 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 22:45:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_info_webpage  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_info_url ,  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 23:35:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                note = ' Refetching age-gated info webpage ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 22:45:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                errnote = ' unable to download video info webpage ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            video_info  =  compat_parse_qs ( video_info_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 00:36:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            add_dash_mpd ( video_info ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            age_gate  =  False 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 13:19:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_info  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-21 01:18:56 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            sts  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 00:36:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Try looking directly into the video webpage 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 21:00:06 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ytplayer_config  =  self . _get_ytplayer_config ( video_id ,  video_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ytplayer_config : 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 20:56:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                args  =  ytplayer_config [ ' args ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 00:36:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  args . get ( ' url_encoded_fmt_stream_map ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    # Convert to the same format returned by compat_parse_qs 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    video_info  =  dict ( ( k ,  [ v ] )  for  k ,  v  in  args . items ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    add_dash_mpd ( video_info ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 01:17:15 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                # Rental video is not rented but preview is available (e.g. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # https://www.youtube.com/watch?v=yYr8q0y5Jfg, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # https://github.com/rg3/youtube-dl/issues/10532) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  not  video_info  and  args . get ( ' ypc_vid ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  self . url_result ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        args [ ' ypc_vid ' ] ,  YoutubeIE . ie_key ( ) ,  video_id = args [ ' ypc_vid ' ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 20:14:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  args . get ( ' livestream ' )  ==  ' 1 '  or  args . get ( ' live_playback ' )  ==  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    is_live  =  True 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-21 01:18:56 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                sts  =  ytplayer_config . get ( ' sts ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 14:31:18 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  not  video_info  or  self . _downloader . params . get ( ' youtube_include_dash_manifest ' ,  True ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # We also try looking in get_video_info since it may contain different dashmpd 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # URL that points to a DASH manifest with possibly different itag set (some itags 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # are missing from DASH manifest pointed by webpage's dashmpd, some - from DASH 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # manifest pointed by get_video_info's dashmpd). 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # The general idea is to take a union of itags of both DASH manifests (for example 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # video with such 'manifest behavior' see https://github.com/rg3/youtube-dl/issues/6093) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 20:56:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                self . report_video_info_webpage_download ( video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-21 01:18:56 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  el  in  ( ' info ' ,  ' embedded ' ,  ' detailpage ' ,  ' vevo ' ,  ' ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    query  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' video_id ' :  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' ps ' :  ' default ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' eurl ' :  ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' gl ' :  ' US ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' hl ' :  ' en ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  el : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        query [ ' el ' ]  =  el 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  sts : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        query [ ' sts ' ]  =  sts 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-04 08:27:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    video_info_webpage  =  self . _download_webpage ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-21 01:18:56 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ' %s ://www.youtube.com/get_video_info '  %  proto , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 20:56:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        video_id ,  note = False , 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-21 01:18:56 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        errnote = ' unable to download video info webpage ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        fatal = False ,  query = query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  not  video_info_webpage : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        continue 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 14:31:18 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    get_video_info  =  compat_parse_qs ( video_info_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 12:43:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    add_dash_mpd ( get_video_info ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 15:38:38 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  view_count  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        view_count  =  extract_view_count ( get_video_info ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 14:31:18 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  not  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        video_info  =  get_video_info 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ' token '  in  get_video_info : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-04 22:49:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        # Different get_video_info requests may report different results, e.g. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # some may report video unavailability, but some may serve it without 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # any complaint (see https://github.com/rg3/youtube-dl/issues/7362, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # the original webpage as well as el=info and el=embedded get_video_info 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # requests report video unavailability due to geo restriction while 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # el=detailpage succeeds and returns valid data). This is probably 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # due to YouTube measures against IP ranges of hosting providers. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # Working around by preferring the first succeeded video_info containing 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # the token if no such video_info yet was found. 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-04 22:12:24 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  ' token '  not  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            video_info  =  get_video_info 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 20:56:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        break 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ' token '  not  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ' reason '  in  video_info : 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 13:15:57 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ' The uploader has not made this video available in your country. '  in  video_info [ ' reason ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-26 16:51:21 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    regions_allowed  =  self . _html_search_meta ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' regionsAllowed ' ,  video_webpage ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    countries  =  regions_allowed . split ( ' , ' )  if  regions_allowed  else  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    self . raise_geo_restricted ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        msg = video_info [ ' reason ' ] [ 0 ] ,  countries = countries ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:34:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  ExtractorError ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' YouTube said:  %s '  %  video_info [ ' reason ' ] [ 0 ] , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:34:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    expected = True ,  video_id = video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:34:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  ExtractorError ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' " token "  parameter not in video info for unknown reason ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:34:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    video_id = video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # title 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ' title '  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_title  =  video_info [ ' title ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( ' Unable to extract video title ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_title  =  ' _ ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # description 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 02:27:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        description_original  =  video_description  =  get_element_by_id ( " eow-description " ,  video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  video_description : 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-17 10:07:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            def  replace_url ( m ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                redir_url  =  compat_urlparse . urljoin ( url ,  m . group ( 1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parsed_redir_url  =  compat_urllib_parse_urlparse ( redir_url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  re . search ( r ' ^(?:www \ .)?(?:youtube(?:-nocookie)? \ .com|youtu \ .be)$ ' ,  parsed_redir_url . netloc )  and  parsed_redir_url . path  ==  ' /redirect ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    qs  =  compat_parse_qs ( parsed_redir_url . query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    q  =  qs . get ( ' q ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  q  and  q [ 0 ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return  q [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  redir_url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 02:27:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            description_original  =  video_description  =  re . sub ( r ''' (?x) 
 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                < a \s + 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-06 22:11:18 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ( ? : [ a - zA - Z - ] + = " [^ " ] * " \ s+)*? 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-08 00:52:55 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ( ? : title | href ) = " ([^ " ] + ) " \ s+ 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-06 22:11:18 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ( ? : [ a - zA - Z - ] + = " [^ " ] * " \ s+)*? 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-24 22:37:13 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    class = " [^ " ] * " [^>]*> 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-08 00:52:55 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                [ ^ < ] + \. { 3 } \s * 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                < / a > 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-17 10:07:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ''' , replace_url, video_description) 
 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_description  =  clean_html ( video_description ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            fd_mobj  =  re . search ( r ' <meta name= " description "  content= " ([^ " ]+) " ' ,  video_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  fd_mobj : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_description  =  unescapeHTML ( fd_mobj . group ( 1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_description  =  ' ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 21:18:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ' multifeed_metadata_list '  in  video_info  and  not  smuggled_data . get ( ' force_singlefeed ' ,  False ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  self . _downloader . params . get ( ' noplaylist ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                entries  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                feed_ids  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 05:01:20 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                multifeed_metadata_list  =  video_info [ ' multifeed_metadata_list ' ] [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 21:18:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  feed  in  multifeed_metadata_list . split ( ' , ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 05:01:20 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    # Unquote should take place before split on comma (,) since textual 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    # fields may contain comma as well (see 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    # https://github.com/rg3/youtube-dl/issues/8536) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    feed_data  =  compat_parse_qs ( compat_urllib_parse_unquote_plus ( feed ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 21:18:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    entries . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' _type ' :  ' url_transparent ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' ie_key ' :  ' Youtube ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' url ' :  smuggle_url ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' %s ://www.youtube.com/watch?v= %s '  %  ( proto ,  feed_data [ ' id ' ] [ 0 ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            { ' force_singlefeed ' :  True } ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' title ' :  ' %s  ( %s ) '  %  ( video_title ,  feed_data [ ' title ' ] [ 0 ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    feed_ids . append ( feed_data [ ' id ' ] [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . to_screen ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' Downloading multifeed video ( %s ) - add --no-playlist to just download video  %s ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    %  ( ' ,  ' . join ( feed_ids ) ,  video_id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  self . playlist_result ( entries ,  video_id ,  video_title ,  video_description ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . to_screen ( ' Downloading just video  %s  because of --no-playlist '  %  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-25 21:30:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 15:38:38 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  view_count  is  None : 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-27 05:59:08 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            view_count  =  extract_view_count ( video_info ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-17 11:06:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # Check for "rental" videos 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ' ypc_video_rental_bar_text '  in  video_info  and  ' author '  not  in  video_info : 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-02 16:59:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            raise  ExtractorError ( ' " rental "  videos not supported. See https://github.com/rg3/youtube-dl/issues/359 for more information. ' ,  expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Start extracting information 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . report_information_extraction ( video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # uploader 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ' author '  not  in  video_info : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            raise  ExtractorError ( ' Unable to extract uploader name ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-17 23:51:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_uploader  =  compat_urllib_parse_unquote_plus ( video_info [ ' author ' ] [ 0 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # uploader_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_uploader_id  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:49:10 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_uploader_url  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . search ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-09 23:50:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' <link itemprop= " url "  href= " (?P<uploader_url>https?://www \ .youtube \ .com/(?:user|channel)/(?P<uploader_id>[^ " ]+)) " > ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:49:10 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  not  None : 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:49:10 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_uploader_id  =  mobj . group ( ' uploader_id ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_uploader_url  =  mobj . group ( ' uploader_url ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( ' unable to extract uploader nickname ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # thumbnail image 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 21:21:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # We try first to get a high quality image: 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_thumb  =  re . search ( r ' <span itemprop= " thumbnail " .*?href= " (.*?) " > ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            video_webpage ,  re . DOTALL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  m_thumb  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_thumbnail  =  m_thumb . group ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        elif  ' thumbnail_url '  not  in  video_info : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( ' unable to extract video thumbnail ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-27 14:22:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_thumbnail  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        else :    # don't panic if we can't find it 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-17 23:51:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_thumbnail  =  compat_urllib_parse_unquote_plus ( video_info [ ' thumbnail_url ' ] [ 0 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # upload date 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-30 20:52:26 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        upload_date  =  self . _html_search_meta ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' datePublished ' ,  video_webpage ,  ' upload date ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  upload_date : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            upload_date  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                [ r ' (?s)id= " eow-date.*?>(.*?)</span> ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-31 00:47:58 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                 r ' (?:id= " watch-uploader-info " .*?>.*?|[ " \' ]simpleText[ " \' ] \ s*: \ s*[ " \' ])(?:Published|Uploaded|Streamed live|Started) on (.+?)[< " \' ] ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-30 20:52:26 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                video_webpage ,  ' upload date ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        upload_date  =  unified_strdate ( upload_date ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_license  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r ' <h4[^>]+class= " title " [^>]*> \ s*License \ s*</h4> \ s*<ul[^>]*> \ s*<li>(.+?)</li ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_webpage ,  ' license ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_music  =  re . search ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-14 22:37:04 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ''' (?x) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < h4 [ ^ > ] + class = " title " [ ^ > ] * > \s * Music \s * < / h4 > \s * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < ul [ ^ > ] * > \s * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < li > ( ? P < title > . + ? ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                by  ( ? P < creator > . + ? ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( ? : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    \( . + ? \) | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    < a [ ^ > ] * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ( ? : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            \bhref = [ " \' ]/red[^>]*>|             # drop possible 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-15 07:02:05 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            > \s * Listen  ad - free  with  YouTube  Red  # YouTube Red ad 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-14 22:37:04 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    . * ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) ? < / li 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ''' , 
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  m_music : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_alt_title  =  remove_quotes ( unescapeHTML ( m_music . group ( ' title ' ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_creator  =  clean_html ( m_music . group ( ' creator ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_alt_title  =  video_creator  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-21 18:10:32 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_episode  =  re . search ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r ' <div[^>]+id= " watch7-headline " [^>]*> \ s*<span[^>]*>.*?>(?P<series>[^<]+)</a></b> \ s*S(?P<season> \ d+) \ s*• \ s*E(?P<episode> \ d+)</span> ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  m_episode : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            series  =  m_episode . group ( ' series ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            season_number  =  int ( m_episode . group ( ' season ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            episode_number  =  int ( m_episode . group ( ' episode ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            series  =  season_number  =  episode_number  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-31 23:26:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_cat_container  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r ' (?s)<h4[^>]*> \ s*Category \ s*</h4> \ s*<ul[^>]*>(.*?)</ul> ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-11 16:32:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_webpage ,  ' categories ' ,  default = None ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 13:59:27 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  m_cat_container : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 12:41:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            category  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 13:43:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                r ' (?s)<a[^<]+>(.*?)</a> ' ,  m_cat_container ,  ' category ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 12:41:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_categories  =  None  if  category  is  None  else  [ category ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_categories  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 13:59:27 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 03:43:32 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_tags  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            unescapeHTML ( m . group ( ' content ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  m  in  re . finditer ( self . _meta_regex ( ' og:video:tag ' ) ,  video_webpage ) ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-31 12:38:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  _extract_count ( count_name ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-29 00:48:06 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  str_to_int ( self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' - %s -button[^>]+><span[^>]+class= " yt-uix-button-content " [^>]*>([ \ d,]+)</span> ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                %  re . escape ( count_name ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_webpage ,  count_name ,  default = None ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        like_count  =  _extract_count ( ' like ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dislike_count  =  _extract_count ( ' dislike ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-06 13:22:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # subtitles 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 16:05:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_subtitles  =  self . extract_subtitles ( video_id ,  video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 21:44:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        automatic_captions  =  self . extract_automatic_captions ( video_id ,  video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-26 21:43:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_duration  =  try_get ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_info ,  lambda  x :  int_or_none ( x [ ' length_seconds ' ] [ 0 ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  video_duration : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_duration  =  parse_duration ( self . _html_search_meta ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' duration ' ,  video_webpage ,  ' video duration ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-14 16:18:58 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # annotations 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_annotations  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  self . _downloader . params . get ( ' writeannotations ' ,  False ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 20:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_annotations  =  self . _extract_annotations ( video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-14 16:18:58 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 02:27:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        chapters  =  self . _extract_chapters ( description_original ,  video_duration ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ' conn '  in  video_info  and  video_info [ ' conn ' ] [ 0 ] . startswith ( ' rtmp ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . report_rtmp_download ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            formats  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' format_id ' :  ' _rtmp ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' protocol ' :  ' rtmp ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' url ' :  video_info [ ' conn ' ] [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' player_url ' :  player_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 21:51:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( video_info . get ( ' url_encoded_fmt_stream_map ' ,  [ ' ' ] ) [ 0 ] )  > =  1  or  len ( video_info . get ( ' adaptive_fmts ' ,  [ ' ' ] ) [ 0 ] )  > =  1 : 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 20:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            encoded_url_map  =  video_info . get ( ' url_encoded_fmt_stream_map ' ,  [ ' ' ] ) [ 0 ]  +  ' , '  +  video_info . get ( ' adaptive_fmts ' ,  [ ' ' ] ) [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-25 16:52:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ' rtmpe % 3Dyes '  in  encoded_url_map : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-10 14:35:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  ExtractorError ( ' rtmpe downloads are not supported, see https://github.com/rg3/youtube-dl/issues/343 for more information. ' ,  expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 17:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            formats_spec  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 14:23:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            fmt_list  =  video_info . get ( ' fmt_list ' ,  [ ' ' ] ) [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  fmt_list : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  fmt  in  fmt_list . split ( ' , ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    spec  =  fmt . split ( ' / ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 17:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  len ( spec )  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        width_height  =  spec [ 1 ] . split ( ' x ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  len ( width_height )  ==  2 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            formats_spec [ spec [ 0 ] ]  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                ' resolution ' :  spec [ 1 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                ' width ' :  int_or_none ( width_height [ 0 ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                ' height ' :  int_or_none ( width_height [ 1 ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            } 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 20:06:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            formats  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-25 16:52:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  url_data_str  in  encoded_url_map . split ( ' , ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                url_data  =  compat_parse_qs ( url_data_str ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ' itag '  not  in  url_data  or  ' url '  not  in  url_data : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                format_id  =  url_data [ ' itag ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                url  =  url_data [ ' url ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 00:47:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ' s '  in  url_data  or  self . _downloader . params . get ( ' youtube_include_dash_manifest ' ,  True ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-30 04:43:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ASSETS_RE  =  r ' " assets " :.+? " js " : \ s*( " [^ " ]+ " ) ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-29 22:58:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    jsplayer_url_json  =  self . _search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-30 04:43:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ASSETS_RE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        embed_webpage  if  age_gate  else  video_webpage , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' JS player URL (1) ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  not  jsplayer_url_json  and  not  age_gate : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # We need the embed website after all 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  embed_webpage  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            embed_url  =  proto  +  ' ://www.youtube.com/embed/ %s '  %  video_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            embed_webpage  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                embed_url ,  video_id ,  ' Downloading embed webpage ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        jsplayer_url_json  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ASSETS_RE ,  embed_webpage ,  ' JS player URL ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-29 22:58:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    player_url  =  json . loads ( jsplayer_url_json ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  player_url  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        player_url_json  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            r ' ytplayer \ .config.*? " url " \ s*: \ s*( " [^ " ]+ " ) ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            video_webpage ,  ' age gate player URL ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        player_url  =  json . loads ( player_url_json ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 00:47:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ' sig '  in  url_data : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    url  + =  ' &signature= '  +  url_data [ ' sig ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                elif  ' s '  in  url_data : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    encrypted_sig  =  url_data [ ' s ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  self . _downloader . params . get ( ' verbose ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-17 16:28:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  player_url  is  None : 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            player_version  =  ' unknown ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            player_desc  =  ' unknown ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            if  player_url . endswith ( ' swf ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                player_version  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    r ' -(.+?)(?:/watch_as3)? \ .swf$ ' ,  player_url , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                    ' flash player ' ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                player_desc  =  ' flash player  %s '  %  player_version 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-17 16:28:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                player_version  =  self . _search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-28 16:25:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                    [ r ' html5player-([^/]+?)(?:/html5player(?:-new)?)? \ .js ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                     r ' (?:www|player)-([^/]+)(?:/[a-z] {2} _[A-Z] {2} )?/base \ .js ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                    player_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    ' html5 player ' ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                player_desc  =  ' html5 player  %s '  %  player_version 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 12:21:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        parts_sizes  =  self . _signature_cache_id ( encrypted_sig ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        self . to_screen ( ' { %s } signature length  %s ,  %s '  % 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:39:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                       ( format_id ,  parts_sizes ,  player_desc ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-02 06:35:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    signature  =  self . _decrypt_signature ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        encrypted_sig ,  video_id ,  player_url ,  age_gate ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    url  + =  ' &signature= '  +  signature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ' ratebypass '  not  in  url : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    url  + =  ' &ratebypass=yes ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 20:06:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-25 01:02:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                dct  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' format_id ' :  format_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' url ' :  url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' player_url ' :  player_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  format_id  in  self . _formats : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    dct . update ( self . _formats [ format_id ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 17:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  format_id  in  formats_spec : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    dct . update ( formats_spec [ format_id ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-25 01:02:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-30 08:07:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                # Some itags are not included in DASH manifest thus corresponding formats will 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # lack metadata (see https://github.com/rg3/youtube-dl/pull/5993). 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # Trying to extract metadata from url_encoded_fmt_stream_map entry. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                mobj  =  re . search ( r ' ^(?P<width> \ d+)[xX](?P<height> \ d+)$ ' ,  url_data . get ( ' size ' ,  [ ' ' ] ) [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                width ,  height  =  ( int ( mobj . group ( ' width ' ) ) ,  int ( mobj . group ( ' height ' ) ) )  if  mobj  else  ( None ,  None ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-25 01:02:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                more_fields  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 20:06:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' filesize ' :  int_or_none ( url_data . get ( ' clen ' ,  [ None ] ) [ 0 ] ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-30 08:07:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' tbr ' :  float_or_none ( url_data . get ( ' bitrate ' ,  [ None ] ) [ 0 ] ,  1000 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 20:06:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' width ' :  width , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' height ' :  height , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' fps ' :  int_or_none ( url_data . get ( ' fps ' ,  [ None ] ) [ 0 ] ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-30 08:07:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' format_note ' :  url_data . get ( ' quality_label ' ,  [ None ] ) [ 0 ]  or  url_data . get ( ' quality ' ,  [ None ] ) [ 0 ] , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 20:06:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-25 01:02:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  key ,  value  in  more_fields . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  value : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        dct [ key ]  =  value 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-30 08:07:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                type_  =  url_data . get ( ' type ' ,  [ None ] ) [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  type_ : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    type_split  =  type_ . split ( ' ; ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    kind_ext  =  type_split [ 0 ] . split ( ' / ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  len ( kind_ext )  ==  2 : 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-25 01:02:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        kind ,  _  =  kind_ext 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        dct [ ' ext ' ]  =  mimetype2ext ( type_split [ 0 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-30 08:07:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  kind  in  ( ' audio ' ,  ' video ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            codecs  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            for  mobj  in  re . finditer ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    r ' (?P<key>[a-zA-Z_-]+)=(?P<quote>[ " \' ]?)(?P<val>.+?)(?P=quote)(?:;|$) ' ,  type_ ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                if  mobj . group ( ' key ' )  ==  ' codecs ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    codecs  =  mobj . group ( ' val ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            if  codecs : 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-12 18:09:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                dct . update ( parse_codecs ( codecs ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-30 08:07:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                formats . append ( dct ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 12:46:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  video_info . get ( ' hlsvp ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            manifest_url  =  video_info [ ' hlsvp ' ] [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-11 21:55:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            formats  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m3u8_formats  =  self . _extract_m3u8_formats ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                manifest_url ,  video_id ,  ' mp4 ' ,  fatal = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  a_format  in  m3u8_formats : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                itag  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    r ' /itag/( \ d+)/ ' ,  a_format [ ' url ' ] ,  ' itag ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  itag : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    a_format [ ' format_id ' ]  =  itag 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  itag  in  self . _formats : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        dct  =  self . _formats [ itag ] . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        dct . update ( a_format ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        a_format  =  dct 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                a_format [ ' player_url ' ]  =  player_url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # Accept-Encoding header causes failures in live streams on Youtube and Youtube Gaming 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-29 19:52:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                a_format . setdefault ( ' http_headers ' ,  { } ) [ ' Youtubedl-no-compression ' ]  =  ' True ' 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-11 21:55:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                formats . append ( a_format ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-19 20:54:43 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            unavailable_message  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' (?s)<h1[^>]+id= " unavailable-message " [^>]*>(.+?)</h1> ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_webpage ,  ' unavailable message ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  unavailable_message : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ExtractorError ( unavailable_message ,  expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            raise  ExtractorError ( ' no conn, hlsvp or url_encoded_fmt_stream_map information found in video info ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Look for the DASH manifest 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-13 00:03:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  self . _downloader . params . get ( ' youtube_include_dash_manifest ' ,  True ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-09 20:48:38 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            dash_mpd_fatal  =  True 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:10:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  mpd_url  in  dash_mpds : 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 00:36:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                dash_formats  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 13:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                try : 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-30 20:05:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    def  decrypt_sig ( mobj ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        s  =  mobj . group ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        dec_s  =  self . _decrypt_signature ( s ,  video_id ,  player_url ,  age_gate ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return  ' /signature/ %s '  %  dec_s 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:10:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    mpd_url  =  re . sub ( r ' /s/([a-fA-F0-9 \ .]+) ' ,  decrypt_sig ,  mpd_url ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-30 22:52:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:10:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    for  df  in  self . _extract_mpd_formats ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            mpd_url ,  video_id ,  fatal = dash_mpd_fatal , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            formats_dict = self . _formats ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 00:36:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        # Do not overwrite DASH format found in some previous DASH manifest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  df [ ' format_id ' ]  not  in  dash_formats : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            dash_formats [ df [ ' format_id ' ] ]  =  df 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-09 20:48:38 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        # Additional DASH manifests may end up in HTTP Error 403 therefore 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # allow them to fail without bug report message if we already have 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # some DASH manifest succeeded. This is temporary workaround to reduce 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # burst of bug reports until we figure out the reason and whether it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # can be fixed at all. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        dash_mpd_fatal  =  False 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 13:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                except  ( ExtractorError ,  KeyError )  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    self . report_warning ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' Skipping DASH manifest:  %r '  %  e ,  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 00:36:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  dash_formats : 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-22 11:58:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    # Remove the formats we found through non-DASH, they 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    # contain less info and it can be wrong, because we use 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    # fixed values (for example the resolution). See 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    # https://github.com/rg3/youtube-dl/issues/5774 for an 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    # example. 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 02:48:50 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    formats  =  [ f  for  f  in  formats  if  f [ ' format_id ' ]  not  in  dash_formats . keys ( ) ] 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-27 00:36:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    formats . extend ( dash_formats . values ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-23 04:51:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 05:45:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Check for malformed aspect ratio 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        stretched_m  =  re . search ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r ' <meta \ s+property= " og:video:tag " .*?content= " yt:stretch=(?P<w>[0-9]+):(?P<h>[0-9]+) " > ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  stretched_m : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-28 01:07:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            w  =  float ( stretched_m . group ( ' w ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            h  =  float ( stretched_m . group ( ' h ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-28 18:50:21 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # yt:stretch may hold invalid ratio data (e.g. for Q39EVAstoRM ratio is 17:0). 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # We will only process correct ratios. 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-28 01:07:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  w  >  0  and  h  >  0 : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-28 08:16:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ratio  =  w  /  h 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-28 01:07:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  f  in  formats : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  f . get ( ' vcodec ' )  !=  ' none ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        f [ ' stretched_ratio ' ]  =  ratio 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 05:45:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:25:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . _sort_formats ( formats ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-18 03:30:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-01 01:01:33 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . mark_watched ( video_id ,  video_info ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-18 03:30:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :  video_uploader , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader_id ' :  video_uploader_id , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:49:10 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' uploader_url ' :  video_uploader_url , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' upload_date ' :  upload_date , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-02 23:07:25 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' license ' :  video_license , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' creator ' :  video_creator , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' title ' :  video_title , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-14 21:31:53 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' alt_title ' :  video_alt_title , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' thumbnail ' :  video_thumbnail , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  video_description , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' categories ' :  video_categories , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 03:43:32 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' tags ' :  video_tags , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' subtitles ' :  video_subtitles , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 21:44:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' automatic_captions ' :  automatic_captions , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' duration ' :  video_duration , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' age_limit ' :  18  if  age_gate  else  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' annotations ' :  video_annotations , 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-06 02:27:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' chapters ' :  chapters , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' webpage_url ' :  proto  +  ' ://www.youtube.com/watch?v= %s '  %  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' view_count ' :  view_count , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-18 03:30:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' like_count ' :  like_count , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' dislike_count ' :  dislike_count , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-11 18:39:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' average_rating ' :  float_or_none ( video_info . get ( ' avg_rating ' ,  [ None ] ) [ 0 ] ) , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:20:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' formats ' :  formats , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 20:14:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' is_live ' :  is_live , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 21:10:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' start_time ' :  start_time , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-23 13:20:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' end_time ' :  end_time , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-21 18:10:32 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' series ' :  series , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' season_number ' :  season_number , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' episode_number ' :  episode_number , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-18 03:30:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 20:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-31 17:49:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubePlaylistIE ( YoutubePlaylistBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com playlists ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-06 19:46:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r """ (?x)(?: 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        ( ? : https ? : / / ) ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ( ? : \w + \. ) ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ( ? : 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-04 20:12:34 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            youtube \. com / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ( ? : 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-28 23:06:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                               ( ? : course | view_play_list | my_playlists | artist | playlist | watch | embed / ( ? : videoseries | [ 0 - 9 A - Za - z_ - ] { 11 } ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-04 20:12:34 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                               \?  ( ? : . * ? [ & ; ] ) * ?  ( ? : p | a | list ) = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            |   p / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ) | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            youtu \. be / [ 0 - 9 A - Za - z_ - ] { 11 } \? . * ? \blist = 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-06 19:46:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 22:01:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ( ? : PL | LL | EC | UU | FL | RD | UL | TL ) ? [ 0 - 9 A - Za - z - _ ] { 10 , } 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 20:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            # Top tracks, they can also include dots 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-06 19:46:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            | ( ? : MC ) [ \w \. ] * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        . * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     | 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-25 01:17:17 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ( % ( playlist_id ) s ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     ) """   %   { ' playlist_id ' : YoutubeBaseInfoExtractor._PLAYLIST_ID_RE} 
 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-02 00:57:14 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TEMPLATE_URL  =  ' https://www.youtube.com/playlist?list= %s ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-18 00:11:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VIDEO_RE  =  r ' href= " \ s*/watch \ ?v=(?P<id>[0-9A-Za-z_-] {11} )&[^ " ]*?index=(?P<index> \ d+)(?:[^>]+>(?P<title>[^<]+))? ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:playlist ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' ytdl test PL ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-09 22:32:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_count ' :  3 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:31:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/playlist?list=PLtPgu7CB4gbZDA7i_euNxn75ISqxwZPYx ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' PLtPgu7CB4gbZDA7i_euNxn75ISqxwZPYx ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:31:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' title ' :  ' YDL_Empty_List ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_count ' :  0 , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-23 02:49:56 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' skip ' :  ' This playlist is private ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:31:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' note ' :  ' Playlist with deleted videos (#651). As a bonus, the video #51 is also twice in this list. ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/playlist?list=PLwP_SiAcdui0KVebT0mU9Apz359a4ubsC ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' 29C3: Not my department ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' PLwP_SiAcdui0KVebT0mU9Apz359a4ubsC ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:31:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_count ' :  95 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' note ' :  ' issue #673 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' PLBB231211A4F62143 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-27 00:06:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' title ' :  ' [OLD]Team Fortress 2 (Class-based LP) ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' PLBB231211A4F62143 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:31:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  26 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' note ' :  ' Large playlist ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0Q ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Uploads from Cauchemar ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' UUBABnxM4Ar9ten8Mdjj1j0Q ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:31:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  799 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKl ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' YDL_safe_search ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKl ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:31:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_count ' :  2 , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-23 02:49:56 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' skip ' :  ' This playlist is private ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:34:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' note ' :  ' embedded ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEu ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:34:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' playlist_count ' :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' JODA15 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEu ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:34:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-28 23:06:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' http://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIl ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  485 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' 2017 華語最新單曲 (2/24更新) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIl ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-25 01:58:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' note ' :  ' Embedded SWF player ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/p/YN5VISEtHet5D4NEvfTd0zcgFk84NqFZ?hl=en_US&fs=1&rel=0 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-25 01:58:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' playlist_count ' :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' JODA7 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' YN5VISEtHet5D4NEvfTd0zcgFk84NqFZ ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-25 01:58:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-15 19:19:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' note ' :  ' Buggy playlist: the webpage has a  " Load more "  button but it doesn \' t have more videos ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/playlist?list=UUXw-G3eDE9trcvY2sBMM_aA ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' title ' :  ' Uploads from Interstellar Movie ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' UUXw-G3eDE9trcvY2sBMM_aA ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-15 19:19:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-19 03:27:18 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  21 , 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Playlist URL that does not actually serve a playlist 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' FqZTN594JQw ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ext ' :  ' webm ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  " Smiley ' s People 01 detective, Adventure Series, Action " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :  ' STREEM ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader_id ' :  ' UCyPhqAZgwYWZfxElWVbVJng ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/channel/UCyPhqAZgwYWZfxElWVbVJng ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' upload_date ' :  ' 20150526 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  ' md5:507cdcb5a49ac0da37a920ece610be80 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' categories ' :  [ ' People & Blogs ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' tags ' :  list , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' like_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' dislike_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' add_ie ' :  [ YoutubeIE . ie_key ( ) ] , 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-19 03:27:18 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://youtu.be/yeWKywCrFtk?list=PL2qgrgXsNUG5ig9cat4ohreBjYLAPC0J5 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' yeWKywCrFtk ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Small Scale Baler and Braiding Rugs ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :  ' Backus-Page House Museum ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader_id ' :  ' backuspagemuseum ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/backuspagemuseum ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-19 03:27:18 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' upload_date ' :  ' 20161008 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  ' md5:800c0c78d5eb128500bffd4f0b4f2e8a ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' categories ' :  [ ' Nonprofits & Activism ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' tags ' :  list , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' like_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' dislike_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' noplaylist ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-04 20:12:34 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://youtu.be/uWyaPkt-VOI?list=PL9D9FC436B881BA21 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 22:01:11 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' TLGGrESM50VT6acwMjAyMjAxNw ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:39:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _real_initialize ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . _login ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _extract_mix ( self ,  playlist_id ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-24 01:35:15 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # The mixes are generated from a single video 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # the id of the playlist is just 'RD' + video_id 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-17 17:07:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ids  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        last_id  =  playlist_id [ - 11 : ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  n  in  itertools . count ( 1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            url  =  ' https://youtube.com/watch?v= %s &list= %s '  %  ( last_id ,  playlist_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            webpage  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                url ,  playlist_id ,  ' Downloading page  {0}  of Youtube mix ' . format ( n ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            new_ids  =  orderedSet ( re . findall ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ''' (?xs)data-video-username= " .*? " .*? 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                           href = " /watch \ ?v=([0-9A-Za-z_-] {11} )&[^ " ] * ? list = % s '''   % r e.escape(playlist_id), 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                webpage ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Fetch new pages until all the videos are repeated, it seems that 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # there are always 51 unique videos. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            new_ids  =  [ _id  for  _id  in  new_ids  if  _id  not  in  ids ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  new_ids : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ids . extend ( new_ids ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            last_id  =  ids [ - 1 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url_results  =  self . _ids_to_results ( ids ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-23 17:17:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        search_title  =  lambda  class_name :  get_element_by_attribute ( ' class ' ,  class_name ,  webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-01 01:00:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        title_span  =  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            search_title ( ' playlist-title ' )  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            search_title ( ' title long-title ' )  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            search_title ( ' title ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-27 20:01:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        title  =  clean_html ( title_span ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . playlist_result ( url_results ,  playlist_id ,  title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 21:41:09 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _extract_playlist ( self ,  playlist_id ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url  =  self . _TEMPLATE_URL  %  playlist_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        page  =  self . _download_webpage ( url ,  playlist_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-22 20:35:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # the yt-alert-message now has tabindex attribute (see https://github.com/rg3/youtube-dl/issues/11604) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  match  in  re . findall ( r ' <div class= " yt-alert-message " [^>]*>([^<]+)</div> ' ,  page ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-28 23:07:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            match  =  match . strip ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Check if the playlist exists or is private 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-23 02:49:56 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            mobj  =  re . match ( r ' [^<]*(?:The|This) playlist (?P<reason>does not exist|is private)[^<]* ' ,  match ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  mobj : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                reason  =  mobj . group ( ' reason ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                message  =  ' This playlist  %s '  %  reason 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ' private '  in  reason : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    message  + =  ' , use --username or --netrc to access it ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                message  + =  ' . ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ExtractorError ( message ,  expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-28 23:07:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            elif  re . match ( r ' [^<]*Invalid parameters[^<]* ' ,  match ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ExtractorError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' Invalid parameters. Maybe URL is incorrect. ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    expected = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            elif  re . match ( r ' [^<]*Choose your language[^<]* ' ,  match ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . report_warning ( ' Youtube gives an alert message:  '  +  match ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-01 15:40:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        playlist_title  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 18:28:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' (?s)<h1 class= " pl-header-title[^ " ]* " [^>]*> \ s*(.*?) \ s*</h1> ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            page ,  ' title ' ,  default = None ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        has_videos  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  playlist_title : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # Some playlist URLs don't actually serve a playlist (e.g. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # https://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                next ( self . _entries ( page ,  playlist_id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            except  StopIteration : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                has_videos  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  has_videos ,  self . playlist_result ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _entries ( page ,  playlist_id ) ,  playlist_id ,  playlist_title ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-18 22:03:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _check_download_just_video ( self ,  url ,  playlist_id ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 21:41:09 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Check if it's a video-specific URL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        query_dict  =  compat_urlparse . parse_qs ( compat_urlparse . urlparse ( url ) . query ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-19 03:27:18 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_id  =  query_dict . get ( ' v ' ,  [ None ] ) [ 0 ]  or  self . _search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-28 23:06:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' (?:(?:^|//)youtu \ .be/|youtube \ .com/embed/(?!videoseries))([0-9A-Za-z_-] {11} ) ' ,  url , 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-19 03:27:18 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' video id ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  video_id : 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 21:41:09 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  self . _downloader . params . get ( ' noplaylist ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . to_screen ( ' Downloading just video  %s  because of --no-playlist '  %  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  video_id ,  self . url_result ( video_id ,  ' Youtube ' ,  video_id = video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 21:41:09 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . to_screen ( ' Downloading playlist  %s  - add --no-playlist to just download video  %s '  %  ( playlist_id ,  video_id ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  video_id ,  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  None ,  None 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 21:41:09 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-18 22:03:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Extract playlist id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( ' Invalid URL:  %s '  %  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        playlist_id  =  mobj . group ( 1 )  or  mobj . group ( 2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_id ,  video  =  self . _check_download_just_video ( url ,  playlist_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-18 22:03:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  video : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  video 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-12 21:38:31 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  playlist_id . startswith ( ( ' RD ' ,  ' UL ' ,  ' PU ' ) ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 21:41:09 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Mixes require a custom extraction process 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  self . _extract_mix ( playlist_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        has_videos ,  playlist  =  self . _extract_playlist ( playlist_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  has_videos  or  not  video_id : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  playlist 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Some playlist URLs don't actually serve a playlist (see 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # https://github.com/rg3/youtube-dl/issues/10537). 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Fallback to plain video extraction if there is a video id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # along with playlist id. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . url_result ( video_id ,  ' Youtube ' ,  video_id = video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 21:41:09 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-18 00:11:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeChannelIE ( YoutubePlaylistBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com channels ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-06 12:20:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:youtu \ .be|(?: \ w+ \ .)?youtube(?:-nocookie)? \ .com)/channel/(?P<id>[0-9A-Za-z_-]+) ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 22:36:41 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TEMPLATE_URL  =  ' https://www.youtube.com/channel/ %s /videos ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-18 00:11:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VIDEO_RE  =  r ' (?:title= " (?P<title>[^ " ]+) " [^>]+)?href= " /watch \ ?v=(?P<id>[0-9A-Za-z_-]+)&? ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:channel ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' note ' :  ' paginated channel ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  91 , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-23 14:16:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' UUKfVa3S1e4PHvxWcwyMMg8w ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Uploads from lex will ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-01 15:33:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-23 14:23:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' note ' :  ' Age restricted channel ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # from https://www.youtube.com/user/DeusExOfficial 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/channel/UCs0ifCMCm1icqRbqhUINa0w ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  64 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' UUs0ifCMCm1icqRbqhUINa0w ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Uploads from Deus Ex ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-20 07:48:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @classmethod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  suitable ( cls ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 01:18:14 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ( False  if  YoutubePlaylistsIE . suitable ( url )  or  YoutubeLiveIE . suitable ( url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                else  super ( YoutubeChannelIE ,  cls ) . suitable ( url ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-20 07:48:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-07-09 08:37:02 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _build_template_url ( self ,  url ,  channel_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . _TEMPLATE_URL  %  channel_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-06 12:20:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        channel_id  =  self . _match_id ( url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-07-09 08:37:02 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url  =  self . _build_template_url ( url ,  channel_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-30 18:29:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Channel by page listing is restricted to 35 pages of 30 items, i.e. 1050 videos total (see #5778) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Workaround by extracting as a playlist if managed to obtain channel playlist URL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # otherwise fallback on channel by page extraction 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        channel_page  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            url  +  ' ?view=57 ' ,  channel_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' Downloading channel page ' ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 00:32:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  channel_page  is  False : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            channel_playlist_id  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            channel_playlist_id  =  self . _html_search_meta ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' channelId ' ,  channel_page ,  ' channel id ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  channel_playlist_id : 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-05 23:30:44 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                channel_url  =  self . _html_search_meta ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ( ' al:ios:url ' ,  ' twitter:app:url:iphone ' ,  ' twitter:app:url:ipad ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    channel_page ,  ' channel url ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  channel_url : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    channel_playlist_id  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        r ' vnd \ .youtube://user/([0-9A-Za-z_-]+) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        channel_url ,  ' channel id ' ,  default = None ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-30 18:29:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  channel_playlist_id  and  channel_playlist_id . startswith ( ' UC ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            playlist_id  =  ' UU '  +  channel_playlist_id [ 2 : ] 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-30 20:50:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  self . url_result ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                compat_urlparse . urljoin ( url ,  ' /playlist?list= %s '  %  playlist_id ) ,  ' YoutubePlaylist ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-30 18:29:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 22:37:45 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        channel_page  =  self . _download_webpage ( url ,  channel_id ,  ' Downloading page #1 ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-08 07:30:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        autogenerated  =  re . search ( r ''' (?x) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                class = " [^ " ] * ? ( ? : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    channel - header - autogenerated - label | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    yt - channel - title - autogenerated 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) [ ^ " ]* " ''' , channel_page) is not None 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-15 11:51:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  autogenerated : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # The videos are contained in a single page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # the ajax pages can't be used, they are empty 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-06 14:02:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            entries  =  [ 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-12 23:19:00 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                self . url_result ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    video_id ,  ' Youtube ' ,  video_id = video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    video_title = video_title ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-13 20:28:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  video_id ,  video_title  in  self . extract_videos_from_page ( channel_page ) ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-06 14:02:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  self . playlist_result ( entries ,  channel_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-07-05 23:30:44 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            next ( self . _entries ( channel_page ,  channel_id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  StopIteration : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            alert_message  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' (?s)<div[^>]+class=([ " \' ]).*? \ byt-alert-message \ b.*? \ 1[^>]*>(?P<alert>[^<]+)</div> ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                channel_page ,  ' alert ' ,  default = None ,  group = ' alert ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  alert_message : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ExtractorError ( ' Youtube said:  %s '  %  alert_message ,  expected = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-18 00:11:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . playlist_result ( self . _entries ( channel_page ,  channel_id ) ,  channel_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 22:36:41 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeUserIE ( YoutubeChannelIE ) :  
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com user videos (URL or  " ytuser "  keyword) ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-09 08:37:02 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' (?:(?:https?://(?: \ w+ \ .)?youtube \ .com/(?:(?P<user>user|c)/)?(?!(?:attribution_link|watch|results)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)(?P<id>[A-Za-z0-9_-]+) ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _TEMPLATE_URL  =  ' https://www.youtube.com/ %s / %s /videos ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:user ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/user/TheLinuxFoundation ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  320 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-05 23:30:44 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' UUfX55Sx5hEFjoC3cNs6mCUQ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Uploads from The Linux Foundation ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-09 08:37:02 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Only available via https://www.youtube.com/c/12minuteathlete/videos 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # but not https://www.youtube.com/user/12minuteathlete/videos 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/c/12minuteathlete/videos ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  249 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' UUVjM-zV6_opMDx7WYxnjZiQ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Uploads from 12 Minute Athlete ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' ytuser:phihag ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-10 16:37:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/c/gametrailers ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-09 08:37:02 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/gametrailers ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-05 23:30:44 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-27 22:22:43 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # This channel is not available, geo restricted to JP 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-05 23:30:44 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/user/kananishinoSMEJ/videos ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 16:24:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @classmethod 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 22:38:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  suitable ( cls ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 16:24:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Don't return True if the url can be extracted with other youtube 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # extractor, the regex would is too permissive and it would match. 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-15 19:04:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        other_yt_ies  =  iter ( klass  for  ( name ,  klass )  in  globals ( ) . items ( )  if  name . startswith ( ' Youtube ' )  and  name . endswith ( ' IE ' )  and  klass  is  not  cls ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  any ( ie . suitable ( url )  for  ie  in  other_yt_ies ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 20:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  super ( YoutubeUserIE ,  cls ) . suitable ( url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 22:38:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-07-09 08:37:02 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _build_template_url ( self ,  url ,  channel_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . _TEMPLATE_URL  %  ( mobj . group ( ' user ' )  or  ' user ' ,  mobj . group ( ' id ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 01:18:14 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeLiveIE ( YoutubeBaseInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com live streams ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-16 23:14:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' (?P<base_url>https?://(?: \ w+ \ .)?youtube \ .com/(?:(?:user|channel|c)/)?(?P<id>[^/]+))/live ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 01:18:14 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:live ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/user/TheYoungTurks/live ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 01:18:14 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' a48o2S1cPoo ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' The Young Turks - Live Main Show ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :  ' The Young Turks ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader_id ' :  ' TheYoungTurks ' , 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 20:08:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' uploader_url ' :  r ' re:https?://(?:www \ .)?youtube \ .com/user/TheYoungTurks ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 01:18:14 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' upload_date ' :  ' 20150715 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' license ' :  ' Standard YouTube License ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  ' md5:438179573adcdff3c97ebb1ee632b891 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' categories ' :  [ ' News & Politics ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' tags ' :  [ ' Cenk Uygur (TV Program Creator) ' ,  ' The Young Turks (Award-Winning Work) ' ,  ' Talk Show (TV Genre) ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' like_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' dislike_count ' :  int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/channel/UC1yBKRuGpC1tSM73A0ZjYjQ/live ' , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 01:18:14 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-04 02:10:23 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/c/CommanderVideoHq/live ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-16 23:14:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/TheYoungTurks/live ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-25 01:18:14 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        channel_id  =  mobj . group ( ' id ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        base_url  =  mobj . group ( ' base_url ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  channel_id ,  fatal = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  webpage : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            page_type  =  self . _og_search_property ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' type ' ,  webpage ,  ' page type ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_id  =  self . _html_search_meta ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' videoId ' ,  webpage ,  ' video id ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  page_type  ==  ' video '  and  video_id  and  re . match ( r ' ^[0-9A-Za-z_-] {11} $ ' ,  video_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  self . url_result ( video_id ,  YoutubeIE . ie_key ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . url_result ( base_url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-20 07:48:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubePlaylistsIE ( YoutubePlaylistsBaseInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com user/channel playlists ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?: \ w+ \ .)?youtube \ .com/(?:user|channel)/(?P<id>[^/]+)/playlists ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:playlists ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 04:17:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:03:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/user/ThirstForScience/playlists ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 04:17:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' ThirstForScience ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Thirst for Science ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:03:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # with "Load more" button 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/user/igorkle1/playlists?view=1&sort=dd ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:03:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  70 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' igorkle1 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Игорь Клейнер ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-20 07:48:16 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/channel/UCiU1dHvZObB2iP6xkJ__Icw/playlists ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  17 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' UCiU1dHvZObB2iP6xkJ__Icw ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Chem Player ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 05:03:23 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 04:17:07 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeSearchIE ( SearchInfoExtractor ,  YoutubePlaylistIE ) :  
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com searches ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # there doesn't appear to be a real limit, for example if you search for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # 'python' you get more than 8.000.000 results 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _MAX_RESULTS  =  float ( ' inf ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:search ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _SEARCH_KEY  =  ' ytsearch ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _EXTRA_QUERY_ARGS  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 20:28:33 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _get_n_results ( self ,  query ,  n ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Get a specified number of results for a query """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        videos  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        limit  =  n 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-03 01:28:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url_query  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' search_query ' :  query . encode ( ' utf-8 ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url_query . update ( self . _EXTRA_QUERY_ARGS ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        result_url  =  ' https://www.youtube.com/results? '  +  compat_urllib_parse_urlencode ( url_query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  pagenum  in  itertools . count ( 1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data  =  self . _download_json ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 09:51:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                result_url ,  video_id = ' query  " %s " '  %  query , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                note = ' Downloading page  %s '  %  pagenum , 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-03 01:28:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                errnote = ' Unable to download API page ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                query = { ' spf ' :  ' navigate ' } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            html_content  =  data [ 1 ] [ ' body ' ] [ ' content ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ' class= " search-message '  in  html_content : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-15 16:30:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  ExtractorError ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' [youtube] No video results ' ,  expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            new_videos  =  self . _ids_to_results ( orderedSet ( re . findall ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' href= " /watch \ ?v=(. {11} ) ' ,  html_content ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            videos  + =  new_videos 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  new_videos  or  len ( videos )  >  limit : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-03 01:28:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            next_link  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' href= " (/results \ ?[^ " ]* \ bsp=[^ " ]+) " [^>]*> \ s*<span[^>]+class= " [^ " ]* \ byt-uix-button-content \ b[^ " ]* " [^>]*>Next ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                html_content ,  ' next link ' ,  default = None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  next_link  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            result_url  =  compat_urlparse . urljoin ( ' https://www.youtube.com/ ' ,  next_link ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  len ( videos )  >  n : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            videos  =  videos [ : n ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . playlist_result ( videos ,  query ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-01 17:59:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 22:40:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeSearchDateIE ( YoutubeSearchIE ) :  
						 
					
						
							
								
									
										
										
										
											2013-12-03 13:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  YoutubeSearchIE . IE_NAME  +  ' :date ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 22:40:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _SEARCH_KEY  =  ' ytsearchdate ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com searches, newest videos first ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 19:30:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _EXTRA_QUERY_ARGS  =  { ' search_sort ' :  ' video_date_uploaded ' } 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-01 17:59:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-26 22:29:29 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeSearchURLIE ( YoutubePlaylistBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com search URLs ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:search_url ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-16 00:29:51 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/results \ ?(.*?&)?(?:search_query|q)=(?P<query>[^&]+)(?:[&]|$) ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-26 22:29:29 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VIDEO_RE  =  r ' href= " \ s*/watch \ ?v=(?P<id>[0-9A-Za-z_-] {11} )(?:[^ " ]* " [^>]+ \ btitle= " (?P<title>[^ " ]+))? ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=video ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  5 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' youtube-dl test video ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-16 00:29:51 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/results?q=test&sp=EgQIBBgB ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-17 23:51:57 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        query  =  compat_urllib_parse_unquote_plus ( mobj . group ( ' query ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  query ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-26 22:29:29 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . playlist_result ( self . _process_page ( webpage ) ,  playlist_title = query ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 04:18:20 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeShowIE ( YoutubePlaylistsBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com (multi-season) shows ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-08 18:29:05 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/show/(?P<id>[^?#]*) ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:show ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-07 12:56:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/show/airdisasters ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-07 07:47:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  5 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 10:25:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' airdisasters ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Air Disasters ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-01 17:59:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 04:18:20 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        playlist_id  =  self . _match_id ( url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  super ( YoutubeShowIE ,  self ) . _real_extract ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' https://www.youtube.com/show/ %s /playlists '  %  playlist_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 13:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeFeedsInfoExtractor ( YoutubeBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2013-07-20 19:33:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    """ 
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Base  class  for  feed  extractors 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 19:33:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Subclasses  must  define  the  _FEED_NAME  and  _PLAYLIST_TITLE  properties . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    """ 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _LOGIN_REQUIRED  =  True 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 19:33:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @property 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  IE_NAME ( self ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ' youtube: %s '  %  self . _FEED_NAME 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 13:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-08 11:23:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _real_initialize ( self ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . _login ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-08 11:23:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 13:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        page  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' https://www.youtube.com/feed/ %s '  %  self . _FEED_NAME ,  self . _PLAYLIST_TITLE ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-14 23:41:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # The extraction process is the same as for playlists, but the regex 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # for the video ids doesn't contain an index 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ids  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        more_widget_html  =  content_html  =  page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  page_num  in  itertools . count ( 1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            matches  =  re . findall ( r ' href= " \ s*/watch \ ?v=([0-9A-Za-z_-] {11} ) ' ,  content_html ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:42:34 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # 'recommended' feed has infinite 'load more' and each new portion spins 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # the same videos in (sometimes) slightly different order, so we'll check 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # for unicity and break when portion has no new videos 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            new_ids  =  filter ( lambda  video_id :  video_id  not  in  ids ,  orderedSet ( matches ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  new_ids : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-14 23:41:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ids . extend ( new_ids ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            mobj  =  re . search ( r ' data-uix-load-more-href= " /?(?P<more>[^ " ]+) " ' ,  more_widget_html ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  mobj : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            more  =  self . _download_json ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' https://youtube.com/ %s '  %  mobj . group ( ' more ' ) ,  self . _PLAYLIST_TITLE , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-14 23:41:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' Downloading page # %s '  %  page_num , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                transform_source = uppercase_escape ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            content_html  =  more [ ' content_html ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            more_widget_html  =  more [ ' load_more_widget_html ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . playlist_result ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _ids_to_results ( ids ) ,  playlist_title = self . _PLAYLIST_TITLE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  YoutubeWatchLaterIE ( YoutubePlaylistIE ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:watchlater ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  ' Youtube watch later list,  " :ytwatchlater "  for short (requires authentication) ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-08 18:29:05 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/(?:feed/watch_later|(?:playlist|watch) \ ?(?:.+&)?list=WL)|:ytwatchlater ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-18 21:50:21 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/playlist?list=WL ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch?v=bCNU9TrbiRk&index=1&list=WL ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-04 00:29:01 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        _ ,  video  =  self . _check_download_just_video ( url ,  ' WL ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-18 22:03:46 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  video : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  video 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-02 23:43:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        _ ,  playlist  =  self . _extract_playlist ( ' WL ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  playlist 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 14:33:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 20:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeFavouritesIE ( YoutubeBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:favorites ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 20:09:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com favourite videos,  " :ytfav "  for short (requires authentication) ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-08 18:29:05 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/my_favorites|:ytfav(?:ou?rites)? ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _LOGIN_REQUIRED  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( ' https://www.youtube.com/my_favorites ' ,  ' Youtube Favourites videos ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        playlist_id  =  self . _search_regex ( r ' list=(.+?)[ " &] ' ,  webpage ,  ' favourites playlist id ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . url_result ( playlist_id ,  ' YoutubePlaylist ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-07 12:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeRecommendedIE ( YoutubeFeedsInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com recommended videos,  " :ytrec "  for short (requires authentication) ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-08 18:29:05 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/feed/recommended|:ytrec(?:ommended)? ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _FEED_NAME  =  ' recommended ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PLAYLIST_TITLE  =  ' Youtube Recommended videos ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-31 23:44:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeSubscriptionsIE ( YoutubeFeedsInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  ' YouTube.com subscriptions feed,  " ytsubs "  keyword (requires authentication) ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-08 18:29:05 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/feed/subscriptions|:ytsubs(?:criptions)? ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _FEED_NAME  =  ' subscriptions ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PLAYLIST_TITLE  =  ' Youtube Subscriptions ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-31 23:44:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeHistoryIE ( YoutubeFeedsInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  ' Youtube watch history,  " :ythistory "  for short (requires authentication) ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-08 18:29:05 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/feed/history|:ythistory ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 21:06:59 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _FEED_NAME  =  ' history ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PLAYLIST_TITLE  =  ' Youtube History ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-31 23:44:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-07 12:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeTruncatedURLIE ( InfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:truncated_url ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  False   # Do not list 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-23 16:14:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ''' (?x) 
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-24 11:42:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( ? : https ? : / / ) ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ( ? : \w + \. ) ? [ yY ] [ oO ] [ uU ] [ tT ] [ uU ] [ bB ] [ eE ] ( ? : - nocookie ) ? \. com / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ( ? : watch \? ( ? : 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:48:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            feature = [ a - z_ ] + | 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-24 11:42:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            annotation_id = annotation_ [ ^ & ] + | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            x - yt - cl = [ 0 - 9 ] + | 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-30 03:45:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            hl = [ ^ & ] * | 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 00:26:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            t = [ 0 - 9 ] + 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-24 11:42:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ) ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            attribution_link \? a = [ ^ & ] + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $ 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-23 16:14:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ''' 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-07 12:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:48:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch?annotation_id=annotation_3951667041 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:48:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:49:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch? ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:49:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-24 11:42:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch?x-yt-cl=84503534 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch?feature=foo ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-30 03:45:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch?hl=en-GB ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 00:26:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch?t=2372 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:48:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-07 12:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  ExtractorError ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' Did 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  ' 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-17 21:48:20 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' " https://www.youtube.com/watch?feature=foo&v=BaW_jenozKc "   ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 07:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            '  or simply  youtube-dl BaW_jenozKc  . ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-07 12:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-01 23:44:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  YoutubeTruncatedIDIE ( InfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  ' youtube:truncated_id ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  False   # Do not list 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-24 11:42:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/watch \ ?v=(?P<id>[0-9A-Za-z_-] { 1,10})$ ' 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-01 23:44:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.youtube.com/watch?v=N_708QY7Ob ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_id  =  self . _match_id ( url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  ExtractorError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' Incomplete YouTube ID  %s . URL  %s  looks truncated. '  %  ( video_id ,  url ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            expected = True )