2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# coding: utf-8  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  collections  
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  errno  
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  io  
						 
					
						
							
								
									
										
										
										
											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  
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  re  
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  struct  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  traceback  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  zlib  
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . common  import  InfoExtractor ,  SearchInfoExtractor  
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:51:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . subtitles  import  SubtitlesInfoExtractor  
						 
					
						
							
								
									
										
										
										
											2014-03-30 07:02:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . . jsinterp  import  JSInterpreter  
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  . . utils  import  (  
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_chr , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    compat_parse_qs , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    compat_urllib_parse , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    compat_urllib_request , 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-01 11:58:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_urlparse , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    compat_str , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    clean_html , 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-02 08:41:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    get_cachedir , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    get_element_by_id , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    get_element_by_attribute , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ExtractorError , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int_or_none , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-20 11:36:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    PagedList , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    unescapeHTML , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    unified_strdate , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 13:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    orderedSet , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    write_json_file , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 17:56:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    uppercase_escape , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02: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 ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _LANG_URL  =  r ' https://www.youtube.com/?hl=en&persist_hl=1&gl=US&persist_gl=1&opt_out_ackd=1 ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 17:11:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _AGE_URL  =  ' https://www.youtube.com/verify_age?next_url=/&gl=US&hl=en ' 
							 
						 
					
						
							
								
									
										
										
										
											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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _set_language ( self ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  bool ( self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _LANG_URL ,  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            note = u ' Setting language ' ,  errnote = ' unable to set language ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            fatal = False ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _login ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ( username ,  password )  =  self . _get_login_info ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # No authentication to be performed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  username  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  self . _LOGIN_REQUIRED : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ExtractorError ( u ' No login info available, needed for using  %s . '  %  self . IE_NAME ,  expected = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        login_page  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _LOGIN_URL ,  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            note = u ' Downloading login page ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            errnote = u ' unable to fetch login page ' ,  fatal = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  login_page  is  False : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 06:45:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        galx  =  self . _search_regex ( r ' (?s)<input.+?name= " GALX " .+?value= " (.+?) " ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                  login_page ,  u ' Login GALX parameter ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Log in 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        login_form_strs  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' continue ' :  u ' https://www.youtube.com/signin?action_handle_signin=true&feature=sign_in_button&hl=en_US&nomobiletemp=1 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' Email ' :  username , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' GALX ' :  galx , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' Passwd ' :  password , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' PersistentCookie ' :  u ' yes ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' _utf8 ' :  u ' 霱 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' bgresponse ' :  u ' js_disabled ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' checkConnection ' :  u ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' checkedDomains ' :  u ' youtube ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' dnConn ' :  u ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' pstMsg ' :  u ' 0 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' rmShown ' :  u ' 1 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' secTok ' :  u ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' signIn ' :  u ' Sign in ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' timeStmp ' :  u ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' service ' :  u ' youtube ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' uilel ' :  u ' 3 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' hl ' :  u ' en_US ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Convert to UTF-8 *before* urlencode because Python 2.x's urlencode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # chokes on unicode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        login_form  =  dict ( ( k . encode ( ' utf-8 ' ) ,  v . encode ( ' utf-8 ' ) )  for  k , v  in  login_form_strs . items ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        login_data  =  compat_urllib_parse . urlencode ( login_form ) . encode ( ' ascii ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        req  =  compat_urllib_request . Request ( self . _LOGIN_URL ,  login_data ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        login_results  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            req ,  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            note = u ' Logging in ' ,  errnote = u ' unable to log in ' ,  fatal = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  login_results  is  False : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  re . search ( r ' (?i)<form[^>]* id= " gaia_loginform " ' ,  login_results )  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( u ' unable to log in: bad username or password ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _confirm_age ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        age_form  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' next_url ' :  ' / ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' action_confirm ' :  ' Confirm ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 17:22:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        req  =  compat_urllib_request . Request ( self . _AGE_URL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            compat_urllib_parse . urlencode ( age_form ) . encode ( ' ascii ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            req ,  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            note = u ' Confirming age ' ,  errnote = u ' Unable to confirm age ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_initialize ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  self . _downloader  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  self . _set_language ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  self . _login ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . _confirm_age ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-08 08:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeIE ( YoutubeBaseInfoExtractor ,  SubtitlesInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2013-07-01 18:52:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 16:42:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r """ (?x)^ 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                     ( 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 13:18:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         ( ? : https ? : / / | / / ) ?                                     # http(s):// or protocol-independent URL (optional) 
							 
						 
					
						
							
								
									
										
										
										
											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 / | 
							 
						 
					
						
							
								
									
										
										
										
											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: 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             ( ? : ( ? : v | embed | e ) / )                                # v/ or embed/ or e/ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             | ( ? :                                              # 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 #! 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                 ( ? : . * ? & ) ?                                     # any other preceding param (like /?s=tuff&v=xxxx) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                 v = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 22:38:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         | youtu \. be /                                           # just youtu.be/xxxx 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-11 13:51:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         | https ? : / / ( ? : 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 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                     ( ? ( 1 ) . + ) ?                                                 # if we found the ID, everything can follow 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     $ """ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _NEXT_URL_RE  =  r ' [ \ ?&]next_url=([^&]+) ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _formats  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 5 ' :  { ' ext ' :  ' flv ' ,  ' width ' :  400 ,  ' height ' :  240 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 6 ' :  { ' ext ' :  ' flv ' ,  ' width ' :  450 ,  ' height ' :  270 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 13 ' :  { ' ext ' :  ' 3gp ' } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 17 ' :  { ' ext ' :  ' 3gp ' ,  ' width ' :  176 ,  ' height ' :  144 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 18 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  640 ,  ' height ' :  360 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 22 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  1280 ,  ' height ' :  720 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 34 ' :  { ' ext ' :  ' flv ' ,  ' width ' :  640 ,  ' height ' :  360 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 35 ' :  { ' ext ' :  ' flv ' ,  ' width ' :  854 ,  ' height ' :  480 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 36 ' :  { ' ext ' :  ' 3gp ' ,  ' width ' :  320 ,  ' height ' :  240 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 37 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  1920 ,  ' height ' :  1080 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 38 ' :  { ' ext ' :  ' mp4 ' ,  ' width ' :  4096 ,  ' height ' :  3072 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 43 ' :  { ' ext ' :  ' webm ' ,  ' width ' :  640 ,  ' height ' :  360 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 44 ' :  { ' ext ' :  ' webm ' ,  ' width ' :  854 ,  ' height ' :  480 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 45 ' :  { ' ext ' :  ' webm ' ,  ' width ' :  1280 ,  ' height ' :  720 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 46 ' :  { ' ext ' :  ' webm ' ,  ' width ' :  1920 ,  ' height ' :  1080 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 12:46:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-01 10:47:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # 3d videos 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-22 14:22:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 82 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  360 ,  ' format_note ' :  ' 3D ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 83 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  480 ,  ' format_note ' :  ' 3D ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 84 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  720 ,  ' format_note ' :  ' 3D ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 85 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1080 ,  ' format_note ' :  ' 3D ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 100 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  360 ,  ' format_note ' :  ' 3D ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 101 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' format_note ' :  ' 3D ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 102 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  720 ,  ' format_note ' :  ' 3D ' ,  ' preference ' :  - 20 } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 18:22:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-03 18:49:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Apple HTTP Live Streaming 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-22 14:22:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 92 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  240 ,  ' format_note ' :  ' HLS ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 93 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  360 ,  ' format_note ' :  ' HLS ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 94 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  480 ,  ' format_note ' :  ' HLS ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 95 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  720 ,  ' format_note ' :  ' HLS ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 96 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1080 ,  ' format_note ' :  ' HLS ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 132 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  240 ,  ' format_note ' :  ' HLS ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 151 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  72 ,  ' format_note ' :  ' HLS ' ,  ' preference ' :  - 10 } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # DASH mp4 video 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-22 14:22:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 133 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  240 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 134 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  360 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 135 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 136 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  720 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 137 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1080 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 138 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  2160 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 160 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  144 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 264 ' :  { ' ext ' :  ' mp4 ' ,  ' height ' :  1440 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 18:22:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-18 18:53:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Dash mp4 audio 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 139 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' vcodec ' :  ' none ' ,  ' abr ' :  48 ,  ' preference ' :  - 50 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 140 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' vcodec ' :  ' none ' ,  ' abr ' :  128 ,  ' preference ' :  - 50 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 141 ' :  { ' ext ' :  ' m4a ' ,  ' format_note ' :  ' DASH audio ' ,  ' vcodec ' :  ' none ' ,  ' abr ' :  256 ,  ' preference ' :  - 50 } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 18:22:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Dash webm 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 17:18:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 167 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  360 ,  ' width ' :  640 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' VP8 ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 168 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' width ' :  854 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' VP8 ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 169 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  720 ,  ' width ' :  1280 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' VP8 ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 170 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  1080 ,  ' width ' :  1920 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' VP8 ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 218 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' width ' :  854 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' VP8 ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 219 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' width ' :  854 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' container ' :  ' webm ' ,  ' vcodec ' :  ' VP8 ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 242 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  240 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 243 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  360 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 244 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 245 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 246 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  480 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 247 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  720 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 248 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  1080 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 14:31:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 271 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  1440 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-21 12:03:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 272 ' :  { ' ext ' :  ' webm ' ,  ' height ' :  2160 ,  ' format_note ' :  ' DASH video ' ,  ' acodec ' :  ' none ' ,  ' preference ' :  - 40 } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Dash webm audio 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 17:18:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' 171 ' :  { ' ext ' :  ' webm ' ,  ' vcodec ' :  ' none ' ,  ' format_note ' :  ' DASH audio ' ,  ' abr ' :  48 ,  ' preference ' :  - 50 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 172 ' :  { ' ext ' :  ' webm ' ,  ' vcodec ' :  ' none ' ,  ' format_note ' :  ' DASH audio ' ,  ' abr ' :  256 ,  ' preference ' :  - 50 } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-09 02:38:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # RTMP (unnamed) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' _rtmp ' :  { ' protocol ' :  ' rtmp ' } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 18:22:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:13:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:55:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u " url " :   u " http://www.youtube.com/watch?v=BaW_jenozKc " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " file " :   u " BaW_jenozKc.mp4 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " info_dict " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " title " :  u " youtube-dl test video  \" ' / \\ ä↭𝕐 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " uploader " :  u " Philipp Hagemeister " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " uploader_id " :  u " phihag " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " upload_date " :  u " 20121002 " , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 12:41:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u " description " :  u " 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 . " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " categories " :  [ u ' Science & Technology ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:13:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:55:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " url " :   u " http://www.youtube.com/watch?v=UxxajLWwzqY " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " file " :   u " UxxajLWwzqY.mp4 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " note " :  u " Test generic use_cipher_signature video (#897) " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " info_dict " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " upload_date " :  u " 20120506 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " title " :  u " Icona Pop - I Love It (feat. Charli XCX) [OFFICIAL VIDEO] " , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-25 12:57:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u " description " :  u " md5:fea86fda2d5a5784273df5c7cc994d9f " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-21 19:25:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u " uploader " :  u " Icona Pop " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:55:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u " uploader_id " :  u " IconaPop " 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:13:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " url " :   u " https://www.youtube.com/watch?v=07FYdnEawAQ " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " file " :   u " 07FYdnEawAQ.mp4 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " note " :  u " Test VEVO video with age protection (#956) " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " info_dict " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " upload_date " :  u " 20130703 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " title " :  u " Justin Timberlake - Tunnel Vision (Explicit) " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " description " :  u " md5:64249768eec3bc4276236606ea996373 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " uploader " :  u " justintimberlakeVEVO " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " uploader_id " :  u " justintimberlakeVEVO " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 13:05:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 13:18:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u " url " :   u " //www.YouTube.com/watch?v=yZIXLfi8CZQ " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 13:05:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u " file " :   u " yZIXLfi8CZQ.mp4 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " note " :  u " Embed-only video (#1746) " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " info_dict " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " upload_date " :  u " 20120608 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " title " :  u " Principal Sexually Assaults A Teacher - Episode 117 - 8th June 2012 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " description " :  u " md5:09b78bd971f1e3e289601dfba15ca4f7 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " uploader " :  u " SET India " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " uploader_id " :  u " setindia " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " url " :  u " http://www.youtube.com/watch?v=a9LDPn-MO4I " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " file " :  u " a9LDPn-MO4I.m4a " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " note " :  u " 256k DASH audio (format 141) via DASH manifest " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " info_dict " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " upload_date " :  " 20121002 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " uploader_id " :  " 8KVIDEO " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " description " :  " No description available. " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " uploader " :  " 8KVIDEO " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " title " :  " UHDTV TEST 8K VIDEO.mp4 " 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-22 21:56:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " params " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " youtube_include_dash_manifest " :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u " format " :  " 141 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 15:15:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # DASH manifest with encrypted signature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u ' url ' :  u ' https://www.youtube.com/watch?v=IB3lcPjvWLA ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' id ' :  u ' IB3lcPjvWLA ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' ext ' :  u ' m4a ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' title ' :  u ' Afrojack - The Spark ft. Spree Wilson ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-25 13:14:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u ' description ' :  u ' md5:9717375db5a9a3992be4668bbf3bc0a8 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 15:15:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u ' uploader ' :  u ' AfrojackVEVO ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' uploader_id ' :  u ' AfrojackVEVO ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' upload_date ' :  u ' 20131011 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " params " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' youtube_include_dash_manifest ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' format ' :  ' 141 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 19:13:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @classmethod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  suitable ( cls ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Receives a URL and returns True if suitable for this IE. """ 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 16:24:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  YoutubePlaylistIE . suitable ( url ) :  return  False 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 13:05:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  re . match ( cls . _VALID_URL ,  url )  is  not  None 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +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. """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . to_screen ( u ' %s : Downloading video info webpage '  %  video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  report_information_extraction ( self ,  video_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Report attempt to extract video information. """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . to_screen ( u ' %s : Extracting video information '  %  video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  report_unavailable_format ( self ,  video_id ,  format ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Report extracted video URL. """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . to_screen ( u ' %s : Format  %s  not available '  %  ( video_id ,  format ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  report_rtmp_download ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Indicate the download will use the RTMP protocol. """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . to_screen ( u ' RTMP download detected ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _extract_signature_function ( self ,  video_id ,  player_url ,  slen ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        id_m  =  re . match ( r ' .*-(?P<id>[a-zA-Z0-9_-]+) \ .(?P<ext>[a-z]+)$ ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        func_id  =  ' %s _ %s _ %d '  %  ( player_type ,  player_id ,  slen ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert  os . path . basename ( func_id )  ==  func_id 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-02 08:41:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        cache_dir  =  get_cachedir ( self . _downloader . params ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-24 21:04:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        cache_enabled  =  cache_dir  is  not  None 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:50:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  cache_enabled : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            cache_fn  =  os . path . join ( os . path . expanduser ( cache_dir ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    u ' youtube-sigfuncs ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    func_id  +  ' .json ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                with  io . open ( cache_fn ,  ' r ' ,  encoding = ' utf-8 ' )  as  cachef : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    cache_spec  =  json . load ( cachef ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  lambda  s :  u ' ' . join ( s [ i ]  for  i  in  cache_spec ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            except  IOError : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                pass   # No cache available 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  player_type  ==  ' js ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            code  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                player_url ,  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                note = u ' Downloading  %s  player  %s '  %  ( player_type ,  player_id ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                errnote = u ' 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 , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                note = u ' Downloading  %s  player  %s '  %  ( player_type ,  player_id ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                errnote = u ' Download of  %s  failed '  %  player_url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:50:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  cache_enabled : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 12:18:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                test_string  =  u ' ' . join ( map ( compat_chr ,  range ( slen ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                cache_res  =  res ( test_string ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                cache_spec  =  [ ord ( c )  for  c  in  cache_res ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    os . makedirs ( os . path . dirname ( cache_fn ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                except  OSError  as  ose : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ose . errno  !=  errno . EEXIST : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        raise 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                write_json_file ( cache_spec ,  cache_fn ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                tb  =  traceback . format_exc ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . _downloader . report_warning ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    u ' Writing cache to  %r  failed:  %s '  %  ( cache_fn ,  tb ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  res 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _print_sig_code ( self ,  func ,  slen ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  gen_sig_code ( idxs ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            def  _genslice ( start ,  end ,  step ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                starts  =  u ' '  if  start  ==  0  else  str ( start ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-24 21:18:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ends  =  ( u ' : %d '  %  ( end + step ) )  if  end  +  step  > =  0  else  u ' : ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                steps  =  u ' '  if  step  ==  1  else  ( u ' : %d '  %  step ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  u ' s[ %s %s %s ] '  %  ( starts ,  ends ,  steps ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            step  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            start  =  ' (Never used) '   # Quelch pyflakes warnings - start will be 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    # set as soon as step is set 
							 
						 
					
						
							
								
									
										
										
										
											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 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    yield  u ' s[ %d ] '  %  prev 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  step  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                yield  u ' s[ %d ] '  %  i 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                yield  _genslice ( start ,  i ,  step ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 12:18:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        test_string  =  u ' ' . join ( map ( compat_chr ,  range ( slen ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cache_res  =  func ( test_string ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        cache_spec  =  [ ord ( c )  for  c  in  cache_res ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        expr_code  =  u '  +  ' . join ( gen_sig_code ( cache_spec ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        code  =  u ' if len(s) ==  %d : \n     return  %s \n '  %  ( slen ,  expr_code ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:50:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . to_screen ( u ' 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 ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-19 16:36:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' signature=([$a-zA-Z]+) ' ,  jscode , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 07:02:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								             u ' Initial JS player signature function name ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        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 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  file_contents [ 1 : 3 ]  !=  b ' WS ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' Not an SWF file; header is  %r '  %  file_contents [ : 3 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  file_contents [ : 1 ]  ==  b ' C ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            content  =  zlib . decompress ( file_contents [ 8 : ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  NotImplementedError ( u ' Unsupported compression format  %r '  % 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                      file_contents [ : 1 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  extract_tags ( content ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pos  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            while  pos  <  len ( content ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                header16  =  struct . unpack ( ' <H ' ,  content [ pos : pos + 2 ] ) [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pos  + =  2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tag_code  =  header16  >>  6 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tag_len  =  header16  &  0x3f 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  tag_len  ==  0x3f : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    tag_len  =  struct . unpack ( ' <I ' ,  content [ pos : pos + 4 ] ) [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    pos  + =  4 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                assert  pos + tag_len  < =  len ( content ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                yield  ( tag_code ,  content [ pos : pos + tag_len ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pos  + =  tag_len 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        code_tag  =  next ( tag 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        for  tag_code ,  tag  in  extract_tags ( content ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  tag_code  ==  82 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        p  =  code_tag . index ( b ' \0 ' ,  4 )  +  1 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        code_reader  =  io . BytesIO ( code_tag [ p : ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Parse ABC (AVM2 ByteCode) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  read_int ( reader = None ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  reader  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                reader  =  code_reader 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            res  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            shift  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  _  in  range ( 5 ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                buf  =  reader . read ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                assert  len ( buf )  ==  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                b  =  struct . unpack ( ' <B ' ,  buf ) [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                res  =  res  |  ( ( b  &  0x7f )  <<  shift ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  b  &  0x80  ==  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                shift  + =  7 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  res 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  u30 ( reader = None ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            res  =  read_int ( reader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            assert  res  &  0xf0000000  ==  0 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  res 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        u32  =  read_int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  s32 ( reader = None ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            v  =  read_int ( reader ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  v  &  0x80000000  !=  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                v  =  -  ( ( v  ^  0xffffffff )  +  1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  v 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  read_string ( reader = None ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  reader  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                reader  =  code_reader 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            slen  =  u30 ( reader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            resb  =  reader . read ( slen ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            assert  len ( resb )  ==  slen 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  resb . decode ( ' utf-8 ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  read_bytes ( count ,  reader = None ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  reader  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                reader  =  code_reader 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            resb  =  reader . read ( count ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            assert  len ( resb )  ==  count 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  resb 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  read_byte ( reader = None ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            resb  =  read_bytes ( 1 ,  reader = reader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            res  =  struct . unpack ( ' <B ' ,  resb ) [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  res 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # minor_version + major_version 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        read_bytes ( 2  +  2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Constant pool 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  _c  in  range ( 1 ,  int_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            s32 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        uint_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  _c  in  range ( 1 ,  uint_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u32 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        double_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        read_bytes ( ( double_count - 1 )  *  8 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        string_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        constant_strings  =  [ u ' ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  _c  in  range ( 1 ,  string_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            s  =  read_string ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            constant_strings . append ( s ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        namespace_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  _c  in  range ( 1 ,  namespace_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            read_bytes ( 1 )   # kind 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u30 ( )   # name 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ns_set_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  _c  in  range ( 1 ,  ns_set_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _c2  in  range ( count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        multiname_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MULTINAME_SIZES  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x07 :  2 ,   # QName 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x0d :  2 ,   # QNameA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x0f :  1 ,   # RTQName 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x10 :  1 ,   # RTQNameA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x11 :  0 ,   # RTQNameL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x12 :  0 ,   # RTQNameLA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x09 :  2 ,   # Multiname 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x0e :  2 ,   # MultinameA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x1b :  1 ,   # MultinameL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            0x1c :  1 ,   # MultinameLA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        multinames  =  [ u ' ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  _c  in  range ( 1 ,  multiname_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            kind  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            assert  kind  in  MULTINAME_SIZES ,  u ' Invalid multiname kind  %r '  %  kind 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  kind  ==  0x07 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # namespace_idx 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                name_idx  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                multinames . append ( constant_strings [ name_idx ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                multinames . append ( ' [MULTINAME kind:  %d ] '  %  kind ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  _c2  in  range ( MULTINAME_SIZES [ kind ] ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Methods 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        method_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MethodInfo  =  collections . namedtuple ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' MethodInfo ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            [ ' NEED_ARGUMENTS ' ,  ' NEED_REST ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        method_infos  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  method_id  in  range ( method_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            param_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u30 ( )   # return type 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _  in  range ( param_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # param type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u30 ( )   # name index (always 0 for youtube) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            flags  =  read_byte ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  flags  &  0x08  !=  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # Options present 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                option_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  c  in  range ( option_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    u30 ( )   # val 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    read_bytes ( 1 )   # kind 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  flags  &  0x80  !=  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # Param names present 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  _  in  range ( param_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    u30 ( )   # param name 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            mi  =  MethodInfo ( flags  &  0x01  !=  0 ,  flags  &  0x04  !=  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            method_infos . append ( mi ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Metadata 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        metadata_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  _c  in  range ( metadata_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u30 ( )   # name 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            item_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _c2  in  range ( item_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # key 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u30 ( )   # value 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  parse_traits_info ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            trait_name_idx  =  u30 ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            kind_full  =  read_byte ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            kind  =  kind_full  &  0x0f 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            attrs  =  kind_full  >>  4 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            methods  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  kind  in  [ 0x00 ,  0x06 ] :   # Slot or Const 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # Slot id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u30 ( )   # type_name_idx 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                vindex  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  vindex  !=  0 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    read_byte ( )   # vkind 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            elif  kind  in  [ 0x01 ,  0x02 ,  0x03 ] :   # Method / Getter / Setter 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # disp_id 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                method_idx  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                methods [ multinames [ trait_name_idx ] ]  =  method_idx 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            elif  kind  ==  0x04 :   # Class 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # slot_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u30 ( )   # classi 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            elif  kind  ==  0x05 :   # Function 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # slot_id 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                function_idx  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                methods [ function_idx ]  =  multinames [ trait_name_idx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ExtractorError ( u ' Unsupported trait kind  %d '  %  kind ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  attrs  &  0x4  !=  0 :   # Metadata present 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                metadata_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  _c3  in  range ( metadata_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    u30 ( )   # metadata index 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  methods 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Classes 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TARGET_CLASSNAME  =  u ' SignatureDecipher ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        searched_idx  =  multinames . index ( TARGET_CLASSNAME ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        searched_class_id  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        class_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  class_id  in  range ( class_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            name_idx  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  name_idx  ==  searched_idx : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # We found the class we're looking for! 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                searched_class_id  =  class_id 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u30 ( )   # super_name idx 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            flags  =  read_byte ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  flags  &  0x08  !=  0 :   # Protected namespace is present 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # protected_ns_idx 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            intrf_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _c2  in  range ( intrf_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u30 ( )   # iinit 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            trait_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _c2  in  range ( trait_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                parse_traits_info ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  searched_class_id  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Target class  %r  not found '  % 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                 TARGET_CLASSNAME ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        method_names  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        method_idxs  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  class_id  in  range ( class_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u30 ( )   # cinit 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            trait_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _c2  in  range ( trait_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                trait_methods  =  parse_traits_info ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  class_id  ==  searched_class_id : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    method_names . update ( trait_methods . items ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    method_idxs . update ( dict ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ( idx ,  name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        for  name ,  idx  in  trait_methods . items ( ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Scripts 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        script_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  _c  in  range ( script_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u30 ( )   # init 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            trait_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _c2  in  range ( trait_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                parse_traits_info ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Method bodies 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        method_body_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        Method  =  collections . namedtuple ( ' Method ' ,  [ ' code ' ,  ' local_count ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        methods  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  _c  in  range ( method_body_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            method_idx  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u30 ( )   # max_stack 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            local_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u30 ( )   # init_scope_depth 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u30 ( )   # max_scope_depth 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            code_length  =  u30 ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            code  =  read_bytes ( code_length ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  method_idx  in  method_idxs : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                m  =  Method ( code ,  local_count ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                methods [ method_idxs [ method_idx ] ]  =  m 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exception_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _c2  in  range ( exception_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                u30 ( )   # from 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u30 ( )   # to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u30 ( )   # target 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u30 ( )   # exc_type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u30 ( )   # var_name 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            trait_count  =  u30 ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  _c2  in  range ( trait_count ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                parse_traits_info ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:32:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        assert  p  +  code_reader . tell ( )  ==  len ( code_tag ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        assert  len ( methods )  ==  len ( method_idxs ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        method_pyfunctions  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  extract_function ( func_name ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  func_name  in  method_pyfunctions : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  method_pyfunctions [ func_name ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  func_name  not  in  methods : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ExtractorError ( u ' Cannot find function  %r '  %  func_name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m  =  methods [ func_name ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            def  resfunc ( args ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                registers  =  [ ' (this) ' ]  +  list ( args )  +  [ None ]  *  m . local_count 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                stack  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                coder  =  io . BytesIO ( m . code ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                while  True : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    opcode  =  struct . unpack ( ' !B ' ,  coder . read ( 1 ) ) [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:48:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  opcode  ==  36 :   # pushbyte 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        v  =  struct . unpack ( ' !B ' ,  coder . read ( 1 ) ) [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( v ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  44 :   # pushstring 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        idx  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( constant_strings [ idx ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  48 :   # pushscope 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # We don't implement the scope register, so we'll just 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        # ignore the popped value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  70 :   # callproperty 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        index  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        mname  =  multinames [ index ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        arg_count  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        args  =  list ( reversed ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            [ stack . pop ( )  for  _  in  range ( arg_count ) ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        obj  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  mname  ==  u ' split ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  len ( args )  ==  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( args [ 0 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( obj ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            if  args [ 0 ]  ==  u ' ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                res  =  list ( obj ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                res  =  obj . split ( args [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            stack . append ( res ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:48:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        elif  mname  ==  u ' slice ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  len ( args )  ==  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( args [ 0 ] ,  int ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( obj ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            res  =  obj [ args [ 0 ] : ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            stack . append ( res ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        elif  mname  ==  u ' join ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  len ( args )  ==  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( args [ 0 ] ,  compat_str ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( obj ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            res  =  args [ 0 ] . join ( obj ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            stack . append ( res ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        elif  mname  in  method_pyfunctions : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            stack . append ( method_pyfunctions [ mname ] ( args ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            raise  NotImplementedError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                u ' Unsupported property  %r  on  %r ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                %  ( mname ,  obj ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:48:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    elif  opcode  ==  72 :   # returnvalue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        res  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return  res 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  79 :   # callpropvoid 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        index  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        mname  =  multinames [ index ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        arg_count  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        args  =  list ( reversed ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            [ stack . pop ( )  for  _  in  range ( arg_count ) ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        obj  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  mname  ==  u ' reverse ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( obj ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            obj . reverse ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            raise  NotImplementedError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                u ' Unsupported (void) property  %r  on  %r ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                %  ( mname ,  obj ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    elif  opcode  ==  93 :   # findpropstrict 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        index  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        mname  =  multinames [ index ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        res  =  extract_function ( mname ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( res ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  97 :   # setproperty 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        index  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        value  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        idx  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        obj  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        assert  isinstance ( obj ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        assert  isinstance ( idx ,  int ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        obj [ idx ]  =  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  98 :   # getlocal 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        index  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( registers [ index ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  99 :   # setlocal 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        index  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        value  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        registers [ index ]  =  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  102 :   # getproperty 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        index  =  u30 ( coder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        pname  =  multinames [ index ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  pname  ==  u ' length ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            obj  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( obj ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            stack . append ( len ( obj ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        else :   # Assume attribute access 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            idx  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( idx ,  int ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            obj  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            assert  isinstance ( obj ,  list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            stack . append ( obj [ idx ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  128 :   # coerce 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        u30 ( coder ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    elif  opcode  ==  133 :   # coerce_s 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        assert  isinstance ( stack [ - 1 ] ,  ( type ( None ) ,  compat_str ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  164 :   # modulo 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        value2  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        value1  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        res  =  value1  %  value2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( res ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:48:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    elif  opcode  ==  208 :   # getlocal_0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( registers [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  209 :   # getlocal_1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( registers [ 1 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  210 :   # getlocal_2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( registers [ 2 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  211 :   # getlocal_3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        stack . append ( registers [ 3 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    elif  opcode  ==  214 :   # setlocal_2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        registers [ 2 ]  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  opcode  ==  215 :   # setlocal_3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        registers [ 3 ]  =  stack . pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        raise  NotImplementedError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            u ' Unsupported opcode  %d '  %  opcode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            method_pyfunctions [ func_name ]  =  resfunc 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  resfunc 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        initial_function  =  extract_function ( u ' decipher ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  player_url  is  not  None : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-15 01:45:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  player_url . startswith ( u ' // ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                player_url  =  u ' https: '  +  player_url 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-04 11:36:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                player_id  =  ( player_url ,  len ( s ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  player_id  not  in  self . _player_cache : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    func  =  self . _extract_signature_function ( 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 00:35:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        video_id ,  player_url ,  len ( s ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-04 11:36:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    self . _player_cache [ player_id ]  =  func 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                func  =  self . _player_cache [ player_id ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  self . _downloader . params . get ( ' youtube_print_sig_code ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    self . _print_sig_code ( func ,  len ( s ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  func ( s ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 10:37:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                tb  =  traceback . format_exc ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                self . _downloader . report_warning ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    u ' Automatic signature extraction failed:  '  +  tb ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 12:18:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' Warning: Falling back to static signature algorithm ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-27 06:15:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:34:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . _static_decrypt_signature ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            s ,  video_id ,  player_url ,  age_gate ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:34:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _static_decrypt_signature ( self ,  s ,  video_id ,  player_url ,  age_gate ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  age_gate : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # The videos with age protection use another player, so the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # algorithms can be different. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  len ( s )  ==  86 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  s [ 2 : 63 ]  +  s [ 82 ]  +  s [ 64 : 82 ]  +  s [ 63 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-19 21:49:06 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  len ( s )  ==  93 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  s [ 86 : 29 : - 1 ]  +  s [ 88 ]  +  s [ 28 : 5 : - 1 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        elif  len ( s )  ==  92 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-18 12:24:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 25 ]  +  s [ 3 : 25 ]  +  s [ 0 ]  +  s [ 26 : 42 ]  +  s [ 79 ]  +  s [ 43 : 79 ]  +  s [ 91 ]  +  s [ 80 : 83 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-20 14:43:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  91 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  s [ 84 : 27 : - 1 ]  +  s [ 86 ]  +  s [ 26 : 5 : - 1 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-18 12:24:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  90 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  s [ 25 ]  +  s [ 3 : 25 ]  +  s [ 2 ]  +  s [ 26 : 40 ]  +  s [ 77 ]  +  s [ 41 : 77 ]  +  s [ 89 ]  +  s [ 78 : 81 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-08 21:48:12 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  89 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  s [ 84 : 78 : - 1 ]  +  s [ 87 ]  +  s [ 77 : 60 : - 1 ]  +  s [ 0 ]  +  s [ 59 : 3 : - 1 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-18 12:24:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  88 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-28 10:26:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 7 : 28 ]  +  s [ 87 ]  +  s [ 29 : 45 ]  +  s [ 55 ]  +  s [ 46 : 55 ]  +  s [ 2 ]  +  s [ 56 : 87 ]  +  s [ 28 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 10:58:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  87 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-15 13:00:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 6 : 27 ]  +  s [ 4 ]  +  s [ 28 : 39 ]  +  s [ 27 ]  +  s [ 40 : 59 ]  +  s [ 2 ]  +  s [ 60 : ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 10:58:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  86 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-24 21:20:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 80 : 72 : - 1 ]  +  s [ 16 ]  +  s [ 71 : 39 : - 1 ]  +  s [ 72 ]  +  s [ 38 : 16 : - 1 ]  +  s [ 82 ]  +  s [ 15 : : - 1 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 10:58:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  85 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-17 16:59:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 3 : 11 ]  +  s [ 0 ]  +  s [ 12 : 55 ]  +  s [ 84 ]  +  s [ 56 : 84 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 10:58:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  84 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-24 21:02:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 78 : 70 : - 1 ]  +  s [ 14 ]  +  s [ 69 : 37 : - 1 ]  +  s [ 70 ]  +  s [ 36 : 14 : - 1 ]  +  s [ 80 ]  +  s [ : 14 ] [ : : - 1 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 10:58:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  83 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-27 06:15:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 80 : 63 : - 1 ]  +  s [ 0 ]  +  s [ 62 : 0 : - 1 ]  +  s [ 63 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 10:58:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  82 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-04 00:43:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 80 : 37 : - 1 ]  +  s [ 7 ]  +  s [ 36 : 7 : - 1 ]  +  s [ 0 ]  +  s [ 6 : 0 : - 1 ]  +  s [ 37 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 10:58:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  81 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-25 22:06:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  s [ 56 ]  +  s [ 79 : 56 : - 1 ]  +  s [ 41 ]  +  s [ 55 : 41 : - 1 ]  +  s [ 80 ]  +  s [ 40 : 34 : - 1 ]  +  s [ 0 ]  +  s [ 33 : 29 : - 1 ]  +  s [ 34 ]  +  s [ 28 : 9 : - 1 ]  +  s [ 29 ]  +  s [ 8 : 0 : - 1 ]  +  s [ 9 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-23 11:33:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  80 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  s [ 1 : 19 ]  +  s [ 0 ]  +  s [ 20 : 68 ]  +  s [ 19 ]  +  s [ 69 : 80 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-25 22:50:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( s )  ==  79 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  s [ 54 ]  +  s [ 77 : 54 : - 1 ]  +  s [ 39 ]  +  s [ 53 : 39 : - 1 ]  +  s [ 78 ]  +  s [ 38 : 34 : - 1 ]  +  s [ 0 ]  +  s [ 33 : 29 : - 1 ]  +  s [ 34 ]  +  s [ 28 : 9 : - 1 ]  +  s [ 29 ]  +  s [ 8 : 0 : - 1 ]  +  s [ 9 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 10:58:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Unable to decrypt signature, key length  %d  not supported; retrying might work '  %  ( len ( s ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 18:01:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _get_available_subtitles ( self ,  video_id ,  webpage ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 16:24:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            sub_list  =  self . _download_webpage ( 
							 
						 
					
						
							
								
									
										
										
										
											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 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( u ' unable to download video subtitles:  %s '  %  compat_str ( err ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        lang_list  =  re . findall ( r ' name= " ([^ " ]*) " [^>]+lang_code= " ([ \ w \ -]+) " ' ,  sub_list ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sub_lang_list  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  l  in  lang_list : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            lang  =  l [ 1 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            params  =  compat_urllib_parse . urlencode ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' lang ' :  lang , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' v ' :  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 17:06:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' fmt ' :  self . _downloader . params . get ( ' subtitlesformat ' ,  ' srt ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-09 01:36:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' name ' :  unescapeHTML ( l [ 0 ] ) . encode ( ' utf-8 ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 17:11:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            url  =  u ' https://www.youtube.com/api/timedtext? '  +  params 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            sub_lang_list [ lang ]  =  url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  sub_lang_list : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( u ' video doesn \' t have subtitles ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  sub_lang_list 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 19:02:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _get_available_automatic_caption ( 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 . """ 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 17:06:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        sub_format  =  self . _downloader . params . get ( ' subtitlesformat ' ,  ' srt ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . to_screen ( u ' %s : Looking for automatic captions '  %  video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . search ( r ' ;ytplayer.config = ( { .*?}); ' ,  webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 19:02:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        err_msg  =  u ' Couldn \' t find automatic captions for  %s '  %  video_id 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( err_msg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        player_config  =  json . loads ( mobj . group ( 1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            args  =  player_config [ u ' args ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            caption_url  =  args [ u ' ttsurl ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            timestamp  =  args [ u ' timestamp ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 19:02:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # We get the available subtitles 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            list_params  =  compat_urllib_parse . urlencode ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' type ' :  ' list ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' tlangs ' :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' asrs ' :  1 , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 15:48:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 19:02:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            list_url  =  caption_url  +  ' & '  +  list_params 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 18:48:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            caption_list  =  self . _download_xml ( list_url ,  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 19:24:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            original_lang_node  =  caption_list . find ( ' track ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 16:28:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  original_lang_node  is  None  or  original_lang_node . attrib . get ( ' kind ' )  !=  ' asr '  : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 19:24:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                self . _downloader . report_warning ( u ' Video doesn \' t have automatic captions ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            original_lang  =  original_lang_node . attrib [ ' lang_code ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 19:02:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sub_lang_list  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  lang_node  in  caption_list . findall ( ' target ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sub_lang  =  lang_node . attrib [ ' lang_code ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                params  =  compat_urllib_parse . urlencode ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' lang ' :  original_lang , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' tlang ' :  sub_lang , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' fmt ' :  sub_format , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' ts ' :  timestamp , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' kind ' :  ' asr ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sub_lang_list [ sub_lang ]  =  caption_url  +  ' & '  +  params 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  ( KeyError ,  ExtractorError ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( err_msg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Invalid URL:  %s '  %  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_id  =  mobj . group ( 2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  video_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 12:46:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _extract_from_m3u8 ( self ,  manifest_url ,  video_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url_map  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  _get_urls ( _manifest ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            lines  =  _manifest . split ( ' \n ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            urls  =  filter ( lambda  l :  l  and  not  l . startswith ( ' # ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            lines ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  urls 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        manifest  =  self . _download_webpage ( manifest_url ,  video_id ,  u ' Downloading formats manifest ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        formats_urls  =  _get_urls ( manifest ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  format_url  in  formats_urls : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-08 18:49:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            itag  =  self . _search_regex ( r ' itag/( \ d+?)/ ' ,  format_url ,  ' itag ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 12:46:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            url_map [ itag ]  =  format_url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  url_map 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . _download_webpage ( url ,  video_id ,  note = u ' Searching for annotations. ' ,  errnote = u ' Unable to download video annotations. ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        proto  =  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u ' http '  if  self . _downloader . params . get ( ' prefer_insecure ' ,  False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else  u ' https ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01: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-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url  =  proto  +  ' ://www.youtube.com/watch?v= %s &gl=US&hl=en&has_verified=1 '  %  video_id 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-06 13:22:04 +01: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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Get video info 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . report_video_info_webpage_download ( video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  re . search ( r ' player-age-gate-content " > ' ,  video_webpage )  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . report_age_confirmation ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data  =  compat_urllib_parse . urlencode ( { ' video_id ' :  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-18 13:05:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                                  ' el ' :  ' player_embedded ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                                  ' gl ' :  ' US ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  ' hl ' :  ' en ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  ' eurl ' :  ' https://youtube.googleapis.com/v/ '  +  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  ' asv ' :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  ' sts ' : ' 1588 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_info_url  =  proto  +  ' ://www.youtube.com/get_video_info? '  +  data 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            video_info_webpage  =  self . _download_webpage ( video_info_url ,  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    note = False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    errnote = ' unable to download video info webpage ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_info  =  compat_parse_qs ( video_info_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            age_gate  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  el_type  in  [ ' &el=embedded ' ,  ' &el=detailpage ' ,  ' &el=vevo ' ,  ' ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                video_info_url  =  ( proto  +  ' ://www.youtube.com/get_video_info?&video_id= %s %s &ps=default&eurl=&gl=US&hl=en ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        %  ( video_id ,  el_type ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_info_webpage  =  self . _download_webpage ( video_info_url ,  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                        note = False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                        errnote = ' unable to download video info webpage ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_info  =  compat_parse_qs ( video_info_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ' token '  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ' token '  not  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ' reason '  in  video_info : 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:34:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  ExtractorError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    u ' YouTube said:  %s '  %  video_info [ ' reason ' ] [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    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 ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    u ' " token "  parameter not in video info for unknown reason ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    video_id = video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-17 11:06:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ' view_count '  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            view_count  =  int ( video_info [ ' view_count ' ] [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            view_count  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' " rental "  videos not supported ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Start extracting information 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . report_information_extraction ( video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # uploader 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ' author '  not  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Unable to extract uploader name ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_uploader  =  compat_urllib_parse . unquote_plus ( video_info [ ' author ' ] [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # uploader_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_uploader_id  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . search ( r ' <link itemprop= " url "  href= " http://www.youtube.com/(?:user|channel)/([^ " ]+) " > ' ,  video_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_uploader_id  =  mobj . group ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( u ' unable to extract uploader nickname ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # title 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-02 07:25:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ' title '  in  video_info : 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-25 13:19:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_title  =  video_info [ ' title ' ] [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-02 07:25:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( u ' Unable to extract video title ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_title  =  u ' _ ' 
							 
						 
					
						
							
								
									
										
										
										
											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 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( u ' 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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_thumbnail  =  compat_urllib_parse . unquote_plus ( video_info [ ' thumbnail_url ' ] [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # upload date 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        upload_date  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 12:41:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        mobj  =  re . search ( r ' (?s)id= " eow-date.*?>(.*?)</span> ' ,  video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 13:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            mobj  =  re . search ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 13:30:23 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                r ' (?s)id= " watch-uploader-info " .*?>.*?(?:Published|Uploaded|Streamed live) on (.*?)</strong> ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 13:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            upload_date  =  '   ' . join ( re . sub ( r ' [/,-] ' ,  r '   ' ,  mobj . group ( 1 ) ) . split ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            upload_date  =  unified_strdate ( upload_date ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 13:59:27 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_cat_container  =  get_element_by_id ( " eow-category " ,  video_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # description 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_description  =  get_element_by_id ( " eow-description " ,  video_webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  video_description : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-04 14:16:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_description  =  re . sub ( r ''' (?x) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < a \s + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ( ? : [ a - zA - Z - ] + = " [^ " ] + " \ s+)*? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    title = " ([^ " ] + ) " \ s+ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ( ? : [ a - zA - Z - ] + = " [^ " ] + " \ s+)*? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    class = " yt-uix-redirect-link " \s * > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                [ ^ < ] + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < / a > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ''' , r ' \1 ' , video_description) 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02: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  =  u ' ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-06 13:22:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  _extract_count ( klass ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-17 02:49:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            count  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' class= " %s " >([ \ d,]+)</span> '  %  re . escape ( klass ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_webpage ,  klass ,  default = None ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-06 13:22:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  count  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  int ( count . replace ( ' , ' ,  ' ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        like_count  =  _extract_count ( u ' likes-count ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dislike_count  =  _extract_count ( u ' dislikes-count ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  self . _downloader . params . get ( ' listsubtitles ' ,  False ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-11 19:17:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _list_available_subtitles ( video_id ,  video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ' length_seconds '  not  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . _downloader . report_warning ( u ' unable to extract video duration ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 04:09:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_duration  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 04:09:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            video_duration  =  int ( compat_urllib_parse . unquote_plus ( video_info [ ' length_seconds ' ] [ 0 ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											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 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_annotations  =  self . _extract_annotations ( video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # Decide which formats to download 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-10 13:35:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            mobj  =  re . search ( r ' ;ytplayer \ .config \ s*= \ s*( { .*?}); ' ,  video_webpage ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-25 11:17:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  not  mobj : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ValueError ( ' Could not find vevo ID ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-10 13:35:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            json_code  =  uppercase_escape ( mobj . group ( 1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ytplayer_config  =  json . loads ( json_code ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 15:15:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            args  =  ytplayer_config [ ' args ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-24 21:19:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Easy way to know if the 's' value is in url_encoded_fmt_stream_map 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # this signatures are encrypted 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-01 14:44:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ' url_encoded_fmt_stream_map '  not  in  args : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-01 11:39:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  ValueError ( u ' No stream_map present ' )   # caught below 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-25 16:52:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            re_signature  =  re . compile ( r ' [&,]s= ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m_s  =  re_signature . search ( args [ ' url_encoded_fmt_stream_map ' ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-24 21:19:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  m_s  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . to_screen ( u ' %s : Encrypted signatures detected. '  %  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                video_info [ ' url_encoded_fmt_stream_map ' ]  =  [ args [ ' url_encoded_fmt_stream_map ' ] ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-25 16:52:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            m_s  =  re_signature . search ( args . get ( ' adaptive_fmts ' ,  u ' ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-20 21:57:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  m_s  is  not  None : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-25 16:52:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ' adaptive_fmts '  in  video_info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    video_info [ ' adaptive_fmts ' ] [ 0 ]  + =  ' , '  +  args [ ' adaptive_fmts ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-20 23:51:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                else : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-25 16:52:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    video_info [ ' adaptive_fmts ' ]  =  [ args [ ' adaptive_fmts ' ] ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        except  ValueError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  _map_to_format_list ( urlmap ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            formats  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  itag ,  video_real_url  in  urlmap . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dct  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' format_id ' :  itag , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' url ' :  video_real_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' player_url ' :  player_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-23 23:21:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  itag  in  self . _formats : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    dct . update ( self . _formats [ itag ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                formats . append ( dct ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  formats 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-25 16:52:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  len ( video_info . get ( ' url_encoded_fmt_stream_map ' ,  [ ] ) )  > =  1  or  len ( video_info . get ( ' adaptive_fmts ' ,  [ ] ) )  > =  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            encoded_url_map  =  video_info . get ( ' url_encoded_fmt_stream_map ' ,  [ ' ' ] ) [ 0 ]  +  ' , '  +  video_info . get ( ' adaptive_fmts ' , [ ' ' ] ) [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            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 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            url_map  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											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 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ' itag '  in  url_data  and  ' url '  in  url_data : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    url  =  url_data [ ' url ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ' sig '  in  url_data : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        url  + =  ' &signature= '  +  url_data [ ' sig ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    elif  ' s '  in  url_data : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        encrypted_sig  =  url_data [ ' s ' ] [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 12:54:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  self . _downloader . params . get ( ' verbose ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            if  age_gate : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 12:17:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                if  player_url  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    player_version  =  ' unknown ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    player_version  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                        r ' -(.+) \ .swf$ ' ,  player_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                        u ' flash player ' ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                player_desc  =  ' flash player  %s '  %  player_version 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            else : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                player_version  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    r ' html5player-(.+?) \ .js ' ,  video_webpage , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-09 14:38:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                    ' html5 player ' ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                player_desc  =  u ' html5 player  %s '  %  player_version 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            parts_sizes  =  u ' . ' . join ( compat_str ( len ( part ) )  for  part  in  encrypted_sig . split ( ' . ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-17 12:08:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            self . to_screen ( u ' encrypted signature length  %d  ( %s ), itag  %s ,  %s '  % 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                ( len ( encrypted_sig ) ,  parts_sizes ,  url_data [ ' itag ' ] [ 0 ] ,  player_desc ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  not  age_gate : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            jsplayer_url_json  =  self . _search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                r ' " assets " :.+? " js " : \ s*( " [^ " ]+ " ) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                video_webpage ,  u ' JS player URL ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            player_url  =  json . loads ( jsplayer_url_json ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 14:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-21 15:19:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        signature  =  self . _decrypt_signature ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            encrypted_sig ,  video_id ,  player_url ,  age_gate ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        url  + =  ' &signature= '  +  signature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ' ratebypass '  not  in  url : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        url  + =  ' &ratebypass=yes ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    url_map [ url_data [ ' itag ' ] [ 0 ] ]  =  url 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            formats  =  _map_to_format_list ( url_map ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 12:46:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  video_info . get ( ' hlsvp ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            manifest_url  =  video_info [ ' hlsvp ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            url_map  =  self . _extract_from_m3u8 ( manifest_url ,  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            formats  =  _map_to_format_list ( url_map ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-27 15:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' 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-02-20 18:19:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( self . _downloader . params . get ( ' youtube_include_dash_manifest ' ,  False ) ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-20 18:19:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                # The DASH manifest used needs to be the one from the original video_webpage. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # The one found in get_video_info seems to be using different signatures. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # However, in the case of an age restriction there won't be any embedded dashmpd in the video_webpage. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # Luckily, it seems, this case uses some kind of default signature (len == 86), so the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # combination of get_video_info and the _static_decrypt_signature() decryption fallback will work here. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  age_gate : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 15:15:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    dash_manifest_url  =  video_info . get ( ' dashmpd ' ) [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-20 18:19:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 15:15:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    dash_manifest_url  =  ytplayer_config [ ' args ' ] [ ' dashmpd ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-20 18:19:03 +01: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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dash_manifest_url  =  re . sub ( r ' /s/([ \ w \ .]+) ' ,  decrypt_sig ,  dash_manifest_url ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                dash_doc  =  self . _download_xml ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-20 18:19:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    dash_manifest_url ,  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-19 05:47:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    note = u ' Downloading DASH manifest ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    errnote = u ' Could not download DASH manifest ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  r  in  dash_doc . findall ( u ' .// { urn:mpeg:DASH:schema:MPD:2011}Representation ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    url_el  =  r . find ( ' { urn:mpeg:DASH:schema:MPD:2011}BaseURL ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  url_el  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    format_id  =  r . attrib [ ' id ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    video_url  =  url_el . text 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    filesize  =  int_or_none ( url_el . attrib . get ( ' { http://youtube.com/yt/2012/10/10}contentLength ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    f  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' format_id ' :  format_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' url ' :  video_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' width ' :  int_or_none ( r . attrib . get ( ' width ' ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' tbr ' :  int_or_none ( r . attrib . get ( ' bandwidth ' ) ,  1000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' asr ' :  int_or_none ( r . attrib . get ( ' audioSamplingRate ' ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' filesize ' :  filesize , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        existing_format  =  next ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            fo  for  fo  in  formats 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            if  fo [ ' format_id ' ]  ==  format_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    except  StopIteration : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        f . update ( self . _formats . get ( format_id ,  { } ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        formats . append ( f ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        existing_format . update ( f ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            except  ( ExtractorError ,  KeyError )  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . report_warning ( u ' Skipping DASH manifest:  %s '  %  e ,  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-23 04:51:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-24 12:25:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . _sort_formats ( formats ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-18 03:30:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :            video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :      video_uploader , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader_id ' :   video_uploader_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' upload_date ' :   upload_date , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :         video_title , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' thumbnail ' :     video_thumbnail , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :   video_description , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 13:59:27 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' categories ' :    video_categories , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-18 03:30:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' subtitles ' :     video_subtitles , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' duration ' :      video_duration , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' age_limit ' :     18  if  age_gate  else  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' annotations ' :   video_annotations , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 00:33:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' webpage_url ' :  proto  +  ' ://www.youtube.com/watch?v= %s '  %  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-18 03:30:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' view_count ' :    view_count , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' like_count ' :  like_count , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' dislike_count ' :  dislike_count , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' formats ' :       formats , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:39:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubePlaylistIE ( YoutubeBaseInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2013-07-01 18:52:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  u ' 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 + \. ) ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        youtube \. com / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ( ? : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                           ( ? : course | view_play_list | my_playlists | artist | playlist | watch ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                           \?  ( ? : . * ? & ) * ?  ( ? : p | a | list ) = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        |   p / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-06 19:46:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-14 13:23:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ( ? : PL | LL | EC | UU | FL | RD ) ? [ 0 - 9 A - Za - z - _ ] { 10 , } 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-06 19:46:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            # Top tracks, they can also include dots  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            | ( ? : MC ) [ \w \. ] * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        . * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     | 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-14 13:23:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ( ( ? : PL | LL | EC | UU | FL | RD ) [ 0 - 9 A - Za - z - _ ] { 10 , } ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                     ) """ 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TEMPLATE_URL  =  ' https://www.youtube.com/playlist?list= %s ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _MORE_PAGES_INDICATOR  =  r ' data-link-type= " next " ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VIDEO_RE  =  r ' href= " \ s*/watch \ ?v=(?P<id>[0-9A-Za-z_-] {11} )&[^ " ]*?index=(?P<index> \ d+) ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube:playlist ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:39:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _real_initialize ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . _login ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _ids_to_results ( self ,  ids ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ self . url_result ( vid_id ,  ' Youtube ' ,  video_id = vid_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       for  vid_id  in  ids ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _extract_mix ( self ,  playlist_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # The mixes are generated from a a single video 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # the id of the playlist is just 'RD' + video_id 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-06 19:48:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url  =  ' https://youtube.com/watch?v= %s &list= %s '  %  ( playlist_id [ - 11 : ] ,  playlist_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  playlist_id ,  u ' Downloading Youtube mix ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-23 17:17:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        search_title  =  lambda  class_name :  get_element_by_attribute ( ' class ' ,  class_name ,  webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        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 ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-05 21:21:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_re  =  r ''' (?x)data-video-username= " .*? " .*? 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-23 17:17:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                       href = " /watch \ ?v=([0-9A-Za-z_-] {11} )&[^ " ] * ? list = % s '''   % r e.escape(playlist_id) 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-05 21:21:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ids  =  orderedSet ( re . findall ( video_re ,  webpage ,  flags = re . DOTALL ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url_results  =  self . _ids_to_results ( ids ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . playlist_result ( url_results ,  playlist_id ,  title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Extract playlist id 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-06 19:46:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Invalid URL:  %s '  %  url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-30 16:26:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        playlist_id  =  mobj . group ( 1 )  or  mobj . group ( 2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Check if it's a video-specific URL 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-01 11:58:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        query_dict  =  compat_urlparse . parse_qs ( compat_urlparse . urlparse ( url ) . query ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-30 16:26:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ' v '  in  query_dict : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_id  =  query_dict [ ' v ' ] [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  self . _downloader . params . get ( ' noplaylist ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . to_screen ( u ' Downloading just video  %s  because of --no-playlist '  %  video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-22 22:46:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  self . url_result ( video_id ,  ' Youtube ' ,  video_id = video_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-30 16:26:25 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-15 17:55:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                self . to_screen ( u ' Downloading playlist  %s  - add --no-playlist to just download video  %s '  %  ( playlist_id ,  video_id ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-06 19:48:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  playlist_id . startswith ( ' RD ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # Mixes require a custom extraction process 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  self . _extract_mix ( playlist_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-30 14:56:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  playlist_id . startswith ( ' TL ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' For downloading YouTube.com top lists, use  ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' the  " yttoplist "  keyword, for example  " youtube-dl  \' yttoplist:music:Top Tracks \' " ' ,  expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url  =  self . _TEMPLATE_URL  %  playlist_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        page  =  self . _download_webpage ( url ,  playlist_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        more_widget_html  =  content_html  =  page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-01 15:40:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Check if the playlist exists or is private 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 07:59:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  re . search ( r ' <div class= " yt-alert-message " >[^<]*?(The|This) playlist (does not exist|is private)[^<]*?</div> ' ,  page )  is  not  None : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-01 15:40:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            raise  ExtractorError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' The playlist doesn \' t exist or is private, use --username or  ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' --netrc to access it. ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                expected = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Extract the video ids from the playlist pages 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ids  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 22:27:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  page_num  in  itertools . count ( 1 ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            matches  =  re . finditer ( self . _VIDEO_RE ,  content_html ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 19:09:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # We remove the duplicates and the link with index 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # (it's not the first video of the playlist) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            new_ids  =  orderedSet ( m . group ( ' id ' )  for  m  in  matches  if  m . group ( ' index ' )  !=  ' 0 ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ids . extend ( new_ids ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            mobj  =  re . search ( r ' data-uix-load-more-href= " /?(?P<more>[^ " ]+) " ' ,  more_widget_html ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  mobj : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            more  =  self . _download_json ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-01 05:56:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' https://youtube.com/ %s '  %  mobj . group ( ' more ' ) ,  playlist_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' Downloading page # %s '  %  page_num , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                transform_source = uppercase_escape ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 17:19:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            content_html  =  more [ ' content_html ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            more_widget_html  =  more [ ' load_more_widget_html ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        playlist_title  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-04 02:23:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' (?s)<h1 class= " pl-header-title[^ " ]* " > \ s*(.*?) \ s*</h1> ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            page ,  u ' title ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 21:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url_results  =  self . _ids_to_results ( ids ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:21:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . playlist_result ( url_results ,  playlist_id ,  playlist_title ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-30 14:56:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeTopListIE ( YoutubePlaylistIE ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube:toplist ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  ( u ' YouTube.com top lists,  " yttoplist: {channel} : { list title} " ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        u '  (Example:  " yttoplist:music:Top Tracks " ) ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' yttoplist:(?P<chann>.*?):(?P<title>.*?)$ ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        channel  =  mobj . group ( ' chann ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        title  =  mobj . group ( ' title ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        query  =  compat_urllib_parse . urlencode ( { ' title ' :  title } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 15:47:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        playlist_re  =  ' href= " ([^ " ]+? %s .*?) " '  %  re . escape ( query ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-30 14:56:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        channel_page  =  self . _download_webpage ( ' https://www.youtube.com/ %s '  %  channel ,  title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        link  =  self . _html_search_regex ( playlist_re ,  channel_page ,  u ' list ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  compat_urlparse . urljoin ( ' https://www.youtube.com/ ' ,  link ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_re  =  r ' data-index= " \ d+ " .*?data-video-id= " ([0-9A-Za-z_-] {11} ) " ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ids  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # sometimes the webpage doesn't contain the videos 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # retry until we get them 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  i  in  itertools . count ( 0 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            msg  =  u ' Downloading Youtube mix ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  i  >  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                msg  + =  ' , retry # %d '  %  i 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            webpage  =  self . _download_webpage ( url ,  title ,  msg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ids  =  orderedSet ( re . findall ( video_re ,  webpage ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ids : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url_results  =  self . _ids_to_results ( ids ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . playlist_result ( url_results ,  playlist_title = title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								class  YoutubeChannelIE ( InfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2013-07-01 18:52:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com channels ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    _VALID_URL  =  r " ^(?:https?://)?(?:youtu \ .be|(?: \ w+ \ .)?youtube(?:-nocookie)? \ .com)/channel/([0-9A-Za-z_-]+) " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _MORE_PAGES_INDICATOR  =  ' yt-uix-load-more ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 17:11:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _MORE_PAGES_URL  =  ' https://www.youtube.com/c4_browse_ajax?action_load_more_videos=1&flow=list&paging= %s &view=0&sort=da&channel_id= %s ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube:channel ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  extract_videos_from_page ( self ,  page ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ids_in_page  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  mobj  in  re . finditer ( r ' href= " /watch \ ?v=([0-9A-Za-z_-]+)&? ' ,  page ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  mobj . group ( 1 )  not  in  ids_in_page : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ids_in_page . append ( mobj . group ( 1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ids_in_page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Extract channel id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Invalid URL:  %s '  %  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Download channel page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        channel_id  =  mobj . group ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_ids  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-15 11:51:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url  =  ' https://www.youtube.com/channel/ %s /videos '  %  channel_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        channel_page  =  self . _download_webpage ( url ,  channel_id ) 
							 
						 
					
						
							
								
									
										
										
										
											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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_ids  =  self . extract_videos_from_page ( channel_page ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Download all channel pages using the json-based channel_ajax query 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  pagenum  in  itertools . count ( 1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                url  =  self . _MORE_PAGES_URL  %  ( pagenum ,  channel_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 17:56:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                page  =  self . _download_json ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    url ,  channel_id ,  note = u ' Downloading page # %s '  %  pagenum , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    transform_source = uppercase_escape ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-15 11:51:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ids_in_page  =  self . extract_videos_from_page ( page [ ' content_html ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_ids . extend ( ids_in_page ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  self . _MORE_PAGES_INDICATOR  not  in  page [ ' load_more_widget_html ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . _downloader . to_screen ( u ' [youtube] Channel  %s : Found  %i  videos '  %  ( channel_id ,  len ( video_ids ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-22 22:46:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        url_entries  =  [ self . url_result ( video_id ,  ' Youtube ' ,  video_id = video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       for  video_id  in  video_ids ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . playlist_result ( url_entries ,  channel_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  YoutubeUserIE ( InfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2013-07-01 18:52:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com user videos (URL or  " ytuser "  keyword) ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' (?:(?:(?:https?://)?(?: \ w+ \ .)?youtube \ .com/(?:user/)?(?!(?:attribution_link|watch|results)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)([A-Za-z0-9_-]+) ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 17:11:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TEMPLATE_URL  =  ' https://gdata.youtube.com/feeds/api/users/ %s ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    _GDATA_PAGE_SIZE  =  50 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 17:11:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _GDATA_URL  =  ' https://gdata.youtube.com/feeds/api/users/ %s /uploads?max-results= %d &start-index= %d &alt=json ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube:user ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        other_ies  =  iter ( klass  for  ( name ,  klass )  in  globals ( ) . items ( )  if  name . endswith ( ' IE ' )  and  klass  is  not  cls ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  any ( ie . suitable ( url )  for  ie  in  other_ies ) :  return  False 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 22:38:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else :  return  super ( YoutubeUserIE ,  cls ) . suitable ( url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Extract username 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Invalid URL:  %s '  %  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        username  =  mobj . group ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Download video ids using YouTube Data API. Result size per 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # query is limited (currently to 50 videos) so we need to query 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # page by page until there are no video ids - it means we got 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # all of them. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-20 11:36:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        def  download_page ( pagenum ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            start_index  =  pagenum  *  self . _GDATA_PAGE_SIZE  +  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            gdata_url  =  self . _GDATA_URL  %  ( username ,  self . _GDATA_PAGE_SIZE ,  start_index ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-20 11:36:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            page  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                gdata_url ,  username , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                u ' Downloading video ids from  %d  to  %d '  %  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    start_index ,  start_index  +  self . _GDATA_PAGE_SIZE ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 10:41:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                response  =  json . loads ( page ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            except  ValueError  as  err : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ExtractorError ( u ' Invalid JSON in API response:  '  +  compat_str ( err ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-18 23:00:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ' entry '  not  in  response [ ' feed ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-20 11:36:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 10:41:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            # Extract video identifiers 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-22 03:57:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            entries  =  response [ ' feed ' ] [ ' entry ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  entry  in  entries : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                title  =  entry [ ' title ' ] [ ' $t ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_id  =  entry [ ' id ' ] [ ' $t ' ] . split ( ' / ' ) [ - 1 ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-20 11:36:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                yield  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-22 03:57:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' _type ' :  ' url ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' url ' :  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' ie_key ' :  ' Youtube ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-29 11:16:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' id ' :  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-22 03:57:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' title ' :  title , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-20 11:36:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url_results  =  PagedList ( download_page ,  self . _GDATA_PAGE_SIZE ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 19:58:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-22 22:46:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . playlist_result ( url_results ,  playlist_title = username ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  YoutubeSearchIE ( SearchInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2013-07-01 18:52:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com searches ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 15:53:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _API_URL  =  u ' https://gdata.youtube.com/feeds/api/videos?q= %s &start-index= %i &max-results=50&v=2&alt=jsonc ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _MAX_RESULTS  =  1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube:search ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _SEARCH_KEY  =  ' ytsearch ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _get_n_results ( self ,  query ,  n ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Get a specified number of results for a query """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_ids  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pagenum  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        limit  =  n 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 15:53:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        PAGE_SIZE  =  50 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 15:53:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        while  ( PAGE_SIZE  *  pagenum )  <  limit : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            result_url  =  self . _API_URL  %  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                compat_urllib_parse . quote_plus ( query . encode ( ' utf-8 ' ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( PAGE_SIZE  *  pagenum )  +  1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 01:49:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            data_json  =  self . _download_webpage ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                result_url ,  video_id = u ' query  " %s " '  %  query , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                note = u ' Downloading page  %s '  %  ( pagenum  +  1 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                errnote = u ' Unable to download API page ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data  =  json . loads ( data_json ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            api_response  =  data [ ' data ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ' items '  not  in  api_response : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-15 16:30:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  ExtractorError ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    u ' [youtube] No video results ' ,  expected = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            new_ids  =  list ( video [ ' id ' ]  for  video  in  api_response [ ' items ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_ids  + =  new_ids 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            limit  =  min ( n ,  api_response [ ' totalItems ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pagenum  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  len ( video_ids )  >  n : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_ids  =  video_ids [ : n ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-22 22:46:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        videos  =  [ self . url_result ( video_id ,  ' Youtube ' ,  video_id = video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  for  video_id  in  video_ids ] 
							 
						 
					
						
							
								
									
										
										
										
											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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _API_URL  =  ' https://gdata.youtube.com/feeds/api/videos?q= %s &start-index= %i &max-results=50&v=2&alt=jsonc&orderby=published ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _SEARCH_KEY  =  ' ytsearchdate ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-03 15:58:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com searches, newest videos first ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-01 17:59:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  YoutubeSearchURLIE ( InfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com search URLs ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube:search_url ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(?:www \ .)?youtube \ .com/results \ ?(.*?&)?search_query=(?P<query>[^&]+)(?:[&]|$) ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        query  =  compat_urllib_parse . unquote_plus ( mobj . group ( ' query ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        result_code  =  self . _search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-04 19:21:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' (?s)<ol class= " item-section " (.*?)</ol> ' ,  webpage ,  u ' result HTML ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        part_codes  =  re . findall ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r ' (?s)<h3 class= " yt-lockup-title " >(.*?)</h3> ' ,  result_code ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        entries  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  part_code  in  part_codes : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            part_title  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-04 19:21:19 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                [ r ' (?s)title= " ([^ " ]+) " ' ,  r ' >([^<]+)</a> ' ] ,  part_code ,  ' item title ' ,  fatal = False ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 03:32:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            part_url_snippet  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' (?s)href= " ([^ " ]+) " ' ,  part_code ,  ' item URL ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            part_url  =  compat_urlparse . urljoin ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' https://www.youtube.com/ ' ,  part_url_snippet ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            entries . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' _type ' :  ' url ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' url ' :  part_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  part_title , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' _type ' :  ' playlist ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' entries ' :  entries , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  query , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-01 17:59:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeShowIE ( InfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2013-07-01 18:52:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com (multi-season) shows ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-01 17:59:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://www \ .youtube \ .com/show/(.*) ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube:show ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        show_name  =  mobj . group ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  show_name ,  u ' Downloading show webpage ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # There's one playlist for each season of the show 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_seasons  =  list ( re . finditer ( r ' href= " (/playlist \ ?list=.*?) " ' ,  webpage ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . to_screen ( u ' %s : Found  %s  seasons '  %  ( show_name ,  len ( m_seasons ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ self . url_result ( ' https://www.youtube.com '  +  season . group ( 1 ) ,  ' YoutubePlaylist ' )  for  season  in  m_seasons ] 
							 
						 
					
						
							
								
									
										
										
										
											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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    """ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Base  class  for  extractors  that  fetch  info  from 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    http : / / www . youtube . com / feed_ajax 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Subclasses  must  define  the  _FEED_NAME  and  _PLAYLIST_TITLE  properties . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    """ 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:40:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _LOGIN_REQUIRED  =  True 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 22:13:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # use action_load_personal_feed instead of action_load_system_feed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PERSONAL_FEED  =  False 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 13:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 19:33:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @property 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _FEED_TEMPLATE ( self ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 22:13:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        action  =  ' action_load_system_feed ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  self . _PERSONAL_FEED : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            action  =  ' action_load_personal_feed ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-25 17:11:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ' https://www.youtube.com/feed_ajax? %s =1&feed_name= %s &paging= %% s '  %  ( action ,  self . _FEED_NAME ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 19:33:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @property 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  IE_NAME ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  u ' 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 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        feed_entries  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-28 00:33:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        paging  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  i  in  itertools . count ( 1 ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-02 14:13:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            info  =  self . _download_json ( self . _FEED_TEMPLATE  %  paging , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 19:33:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                          u ' %s  feed '  %  self . _FEED_NAME , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 13:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                          u ' Downloading page  %s '  %  i ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-02 14:13:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            feed_html  =  info . get ( ' feed_html ' )  or  info . get ( ' content_html ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 22:13:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            m_ids  =  re . finditer ( r ' " /watch \ ?v=(.*?)[ " &] ' ,  feed_html ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 13:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ids  =  orderedSet ( m . group ( 1 )  for  m  in  m_ids ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-22 22:46:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            feed_entries . extend ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . url_result ( video_id ,  ' Youtube ' ,  video_id = video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  video_id  in  ids ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 15:52:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            mobj  =  re . search ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' data-uix-load-more-href= " /?[^ " ]+paging=(?P<paging> \ d+) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                feed_html ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  mobj  is  None : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-07 13:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 15:52:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            paging  =  mobj . group ( ' paging ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 19:33:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . playlist_result ( feed_entries ,  playlist_title = self . _PLAYLIST_TITLE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  YoutubeSubscriptionsIE ( YoutubeFeedsInfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2014-04-03 15:13:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com subscriptions feed,  " ytsubs "  keyword (requires authentication) ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 19:33:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://www \ .youtube \ .com/feed/subscriptions|:ytsubs(?:criptions)? ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _FEED_NAME  =  ' subscriptions ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PLAYLIST_TITLE  =  u ' Youtube Subscriptions ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  YoutubeRecommendedIE ( YoutubeFeedsInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com recommended videos,  " ytrec "  keyword (requires authentication) ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://www \ .youtube \ .com/feed/recommended|:ytrec(?:ommended)? ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _FEED_NAME  =  ' recommended ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PLAYLIST_TITLE  =  u ' Youtube Recommended videos ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 22:13:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeWatchLaterIE ( YoutubeFeedsInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  u ' Youtube watch later list,  " ytwatchlater "  keyword (requires authentication) ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://www \ .youtube \ .com/feed/watch_later|:ytwatchlater ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _FEED_NAME  =  ' watch_later ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PLAYLIST_TITLE  =  u ' Youtube Watch Later ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PERSONAL_FEED  =  True 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 14:33:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeHistoryIE ( YoutubeFeedsInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  u ' Youtube watch history,  " ythistory "  keyword (requires authentication) ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _VALID_URL  =  u ' https?://www \ .youtube \ .com/feed/history|:ythistory ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _FEED_NAME  =  ' history ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PERSONAL_FEED  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _PLAYLIST_TITLE  =  u ' Youtube Watch History ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 20:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  YoutubeFavouritesIE ( YoutubeBaseInfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  u ' youtube:favorites ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_DESC  =  u ' YouTube.com favourite videos,  " ytfav "  keyword (requires authentication) ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 20:13:05 +02: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 ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        playlist_id  =  self . _search_regex ( r ' list=(.+?)[ " &] ' ,  webpage ,  u ' favourites playlist id ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . url_result ( playlist_id ,  ' YoutubePlaylist ' ) 
							 
						 
					
						
							
								
									
										
										
										
											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) 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:48:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( ? : https ? : / / ) ? [ ^ / ] + / watch \? ( ? : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            feature = [ a - z_ ] + | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            annotation_id = annotation_ [ ^ & ] + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) ? $ | 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-23 16:14:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( ? : https ? : / / ) ? ( ? : www \. ) ? youtube \. com / attribution_link \? a = [ ^ & ] + $ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ''' 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-07 12:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:48:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' http://www.youtube.com/watch?annotation_id=annotation_3951667041 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' only_matching ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 15:49:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' http://www.youtube.com/watch? ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' 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 ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u ' Did you forget to quote the URL? Remember that & is a meta  ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u ' character in most shells, so you want to put the URL in quotes,  ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u ' like  youtube-dl  ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-08 00:05:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            u ' " http://www.youtube.com/watch?feature=foo&v=BaW_jenozKc "   ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u '  or simply  youtube-dl BaW_jenozKc  . ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-07 12:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            expected = True )