mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	Merge pull request #736 from rg3/retry
Exception stacking and test retry
This commit is contained in:
		| @@ -20,6 +20,8 @@ from youtube_dl.utils import * | |||||||
| DEF_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tests.json') | DEF_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tests.json') | ||||||
| PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "parameters.json") | PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "parameters.json") | ||||||
|  |  | ||||||
|  | RETRIES = 3 | ||||||
|  |  | ||||||
| # General configuration (from __init__, not very elegant...) | # General configuration (from __init__, not very elegant...) | ||||||
| jar = compat_cookiejar.CookieJar() | jar = compat_cookiejar.CookieJar() | ||||||
| cookie_processor = compat_urllib_request.HTTPCookieProcessor(jar) | cookie_processor = compat_urllib_request.HTTPCookieProcessor(jar) | ||||||
| @@ -93,8 +95,20 @@ def generator(test_case): | |||||||
|             _try_rm(tc['file']) |             _try_rm(tc['file']) | ||||||
|             _try_rm(tc['file'] + '.part') |             _try_rm(tc['file'] + '.part') | ||||||
|             _try_rm(tc['file'] + '.info.json') |             _try_rm(tc['file'] + '.info.json') | ||||||
|  |         try: | ||||||
|  |             for retry in range(1, RETRIES + 1): | ||||||
|                 try: |                 try: | ||||||
|                     fd.download([test_case['url']]) |                     fd.download([test_case['url']]) | ||||||
|  |                 except (DownloadError, ExtractorError) as err: | ||||||
|  |                     if retry == RETRIES: raise | ||||||
|  |  | ||||||
|  |                     # Check if the exception is not a network related one | ||||||
|  |                     if not err.exc_info[0] in (ZeroDivisionError, compat_urllib_error.URLError, socket.timeout): | ||||||
|  |                         raise | ||||||
|  |  | ||||||
|  |                     print('Retrying: {0} failed tries\n\n##########\n\n'.format(retry)) | ||||||
|  |                 else: | ||||||
|  |                     break | ||||||
|  |  | ||||||
|             for tc in test_cases: |             for tc in test_cases: | ||||||
|                 if not test_case.get('params', {}).get('skip_download', False): |                 if not test_case.get('params', {}).get('skip_download', False): | ||||||
|   | |||||||
| @@ -231,11 +231,21 @@ class FileDownloader(object): | |||||||
|             self.to_stderr(message) |             self.to_stderr(message) | ||||||
|         if self.params.get('verbose'): |         if self.params.get('verbose'): | ||||||
|             if tb is None: |             if tb is None: | ||||||
|  |                 if sys.exc_info()[0]:  # if .trouble has been called from an except block | ||||||
|  |                     tb = u'' | ||||||
|  |                     if hasattr(sys.exc_info()[1], 'exc_info') and sys.exc_info()[1].exc_info[0]: | ||||||
|  |                         tb += u''.join(traceback.format_exception(*sys.exc_info()[1].exc_info)) | ||||||
|  |                     tb += compat_str(traceback.format_exc()) | ||||||
|  |                 else: | ||||||
|                     tb_data = traceback.format_list(traceback.extract_stack()) |                     tb_data = traceback.format_list(traceback.extract_stack()) | ||||||
|                     tb = u''.join(tb_data) |                     tb = u''.join(tb_data) | ||||||
|             self.to_stderr(tb) |             self.to_stderr(tb) | ||||||
|         if not self.params.get('ignoreerrors', False): |         if not self.params.get('ignoreerrors', False): | ||||||
|             raise DownloadError(message) |             if sys.exc_info()[0] and hasattr(sys.exc_info()[1], 'exc_info') and sys.exc_info()[1].exc_info[0]: | ||||||
|  |                 exc_info = sys.exc_info()[1].exc_info | ||||||
|  |             else: | ||||||
|  |                 exc_info = sys.exc_info() | ||||||
|  |             raise DownloadError(message, exc_info) | ||||||
|         self._download_retcode = 1 |         self._download_retcode = 1 | ||||||
|  |  | ||||||
|     def report_warning(self, message): |     def report_warning(self, message): | ||||||
|   | |||||||
| @@ -435,6 +435,7 @@ class ExtractorError(Exception): | |||||||
|         """ tb, if given, is the original traceback (so that it can be printed out). """ |         """ tb, if given, is the original traceback (so that it can be printed out). """ | ||||||
|         super(ExtractorError, self).__init__(msg) |         super(ExtractorError, self).__init__(msg) | ||||||
|         self.traceback = tb |         self.traceback = tb | ||||||
|  |         self.exc_info = sys.exc_info()  # preserve original exception | ||||||
|  |  | ||||||
|     def format_traceback(self): |     def format_traceback(self): | ||||||
|         if self.traceback is None: |         if self.traceback is None: | ||||||
| @@ -449,7 +450,10 @@ class DownloadError(Exception): | |||||||
|     configured to continue on errors. They will contain the appropriate |     configured to continue on errors. They will contain the appropriate | ||||||
|     error message. |     error message. | ||||||
|     """ |     """ | ||||||
|     pass |     def __init__(self, msg, exc_info=None): | ||||||
|  |         """ exc_info, if given, is the original exception that caused the trouble (as returned by sys.exc_info()). """ | ||||||
|  |         super(DownloadError, self).__init__(msg) | ||||||
|  |         self.exc_info = exc_info | ||||||
|  |  | ||||||
|  |  | ||||||
| class SameFileError(Exception): | class SameFileError(Exception): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Filippo Valsorda
					Filippo Valsorda