| 
					
				 | 
			
			
				@@ -7,7 +7,6 @@ import itertools 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import json 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import os.path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import re 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import socket 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import struct 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import traceback 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -17,9 +16,7 @@ from .common import InfoExtractor, SearchInfoExtractor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from .subtitles import SubtitlesInfoExtractor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from ..utils import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     compat_chr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    compat_http_client, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     compat_parse_qs, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    compat_urllib_error, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     compat_urllib_parse, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     compat_urllib_request, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     compat_urlparse, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -53,9 +50,9 @@ class YoutubeBaseInfoExtractor(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         request = compat_urllib_request.Request(self._LANG_URL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self.report_lang() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            compat_urllib_request.urlopen(request).read() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self._downloader.report_warning(u'unable to set language: %s' % compat_str(err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            self._download_webpage(self._LANG_URL, None, False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except ExtractorError as err: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            self._downloader.report_warning(u'unable to set language: %s' % compat_str(err.cause)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -67,12 +64,8 @@ class YoutubeBaseInfoExtractor(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 raise ExtractorError(u'No login info available, needed for using %s.' % self.IE_NAME, expected=True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        request = compat_urllib_request.Request(self._LOGIN_URL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            login_page = compat_urllib_request.urlopen(request).read().decode('utf-8') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self._downloader.report_warning(u'unable to fetch login page: %s' % compat_str(err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        login_page = self._download_webpage(self._LOGIN_URL, None, False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            u'Unable to fetch login page') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         galx = self._search_regex(r'(?s)<input.+?name="GALX".+?value="(.+?)"', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                   login_page, u'Login GALX parameter') 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -105,12 +98,12 @@ class YoutubeBaseInfoExtractor(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         request = compat_urllib_request.Request(self._LOGIN_URL, login_data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self.report_login() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            login_results = compat_urllib_request.urlopen(request).read().decode('utf-8') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            login_results = self._download_webpage(request, None, 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') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self._downloader.report_warning(u'unable to log in: %s' % compat_str(err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except ExtractorError as err: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            self._downloader.report_warning(u'unable to log in: %s' % compat_str(err.cause)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -120,11 +113,8 @@ class YoutubeBaseInfoExtractor(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 'action_confirm':   'Confirm', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         request = compat_urllib_request.Request(self._AGE_URL, compat_urllib_parse.urlencode(age_form)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.report_age_confirmation() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            compat_urllib_request.urlopen(request).read().decode('utf-8') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            raise ExtractorError(u'Unable to confirm age: %s' % compat_str(err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.report_age_confirmation() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._download_webpage(request, None, False, u'Unable to confirm age') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def _real_initialize(self): 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1737,10 +1727,6 @@ class YoutubeSearchIE(SearchInfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     IE_NAME = u'youtube:search' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _SEARCH_KEY = 'ytsearch' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def report_download_page(self, query, pagenum): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """Report attempt to download search page with given number.""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self._downloader.to_screen(u'[youtube] query "%s": Downloading page %s' % (query, pagenum)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def _get_n_results(self, query, n): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         """Get a specified number of results for a query""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1749,13 +1735,9 @@ class YoutubeSearchIE(SearchInfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         limit = n 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         while (50 * pagenum) < limit: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.report_download_page(query, pagenum+1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             result_url = self._API_URL % (compat_urllib_parse.quote_plus(query), (50*pagenum)+1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            request = compat_urllib_request.Request(result_url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                data = compat_urllib_request.urlopen(request).read().decode('utf-8') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                raise ExtractorError(u'Unable to download API page: %s' % compat_str(err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data = self._download_webpage(result_url, u'query "%s"' % query, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                u'Downloading page %s' % pagenum, u'Unable to download API page') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             api_response = json.loads(data)['data'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if not 'items' in api_response: 
			 |