浏览代码

Add a couple of exceptions to avoid exiting from class methods

Ricardo Garcia 17 年之前
父节点
当前提交
e5bf0f551b
共有 1 个文件被更改,包括 30 次插入7 次删除
  1. 30 7
      youtube-dl

+ 30 - 7
youtube-dl

@@ -25,6 +25,23 @@ std_headers = {
 
 
 simple_title_chars = string.ascii_letters.decode('ascii') + string.digits.decode('ascii')
 simple_title_chars = string.ascii_letters.decode('ascii') + string.digits.decode('ascii')
 
 
+class DownloadError(Exception):
+	"""Download Error exception.
+	
+	This exception may be thrown by FileDownloader objects if they are not
+	configured to continue on errors. They will contain the appropriate
+	error message.
+	"""
+	pass
+
+class SameFileError(Exception):
+	"""Same File exception.
+
+	This exception will be thrown by FileDownloader objects if they detect
+	multiple files would have to be downloaded to the same file on disk.
+	"""
+	pass
+
 class FileDownloader(object):
 class FileDownloader(object):
 	"""File Downloader class.
 	"""File Downloader class.
 
 
@@ -165,22 +182,22 @@ class FileDownloader(object):
 		"""Determine action to take when a download problem appears.
 		"""Determine action to take when a download problem appears.
 
 
 		Depending on if the downloader has been configured to ignore
 		Depending on if the downloader has been configured to ignore
-		download errors or not, this method may exit the program or
+		download errors or not, this method may throw an exception or
 		not when errors are found, after printing the message. If it
 		not when errors are found, after printing the message. If it
-		doesn't exit, it returns an error code suitable to be returned
+		doesn't raise, it returns an error code suitable to be returned
 		later as a program exit code to indicate error.
 		later as a program exit code to indicate error.
 		"""
 		"""
 		if message is not None:
 		if message is not None:
 			self.to_stderr(message)
 			self.to_stderr(message)
 		if not self._params.get('ignoreerrors', False):
 		if not self._params.get('ignoreerrors', False):
-			sys.exit(1)
+			raise DownloadError(message)
 		return 1
 		return 1
 
 
 	def download(self, url_list):
 	def download(self, url_list):
 		"""Download a given list of URLs."""
 		"""Download a given list of URLs."""
 		retcode = 0
 		retcode = 0
 		if len(url_list) > 1 and self.fixed_template():
 		if len(url_list) > 1 and self.fixed_template():
-			sys.exit('ERROR: fixed output name but more than one file to download')
+			raise SameFileError(self._params['outtmpl'])
 
 
 		for url in url_list:
 		for url in url_list:
 			suitable_found = False
 			suitable_found = False
@@ -195,7 +212,7 @@ class FileDownloader(object):
 					retcode = self.trouble()
 					retcode = self.trouble()
 
 
 				if len(results) > 1 and self.fixed_template():
 				if len(results) > 1 and self.fixed_template():
-					sys.exit('ERROR: fixed output name but more than one file to download')
+					raise SameFileError(self._params['outtmpl'])
 
 
 				for result in results:
 				for result in results:
 
 
@@ -401,7 +418,8 @@ class YoutubeIE(InfoExtractor):
 			self.to_stdout('[youtube] Confirming age')
 			self.to_stdout('[youtube] Confirming age')
 			age_results = urllib2.urlopen(request).read()
 			age_results = urllib2.urlopen(request).read()
 		except (urllib2.URLError, httplib.HTTPException, socket.error), err:
 		except (urllib2.URLError, httplib.HTTPException, socket.error), err:
-			sys.exit('ERROR: unable to confirm age: %s' % str(err))
+			self.to_stderr('ERROR: unable to confirm age: %s' % str(err))
+			return
 
 
 	def _real_extract(self, url):
 	def _real_extract(self, url):
 		# Extract video id from URL
 		# Extract video id from URL
@@ -429,7 +447,8 @@ class YoutubeIE(InfoExtractor):
 			self.to_stdout('[youtube] %s: Downloading video webpage' % video_id)
 			self.to_stdout('[youtube] %s: Downloading video webpage' % video_id)
 			video_webpage = urllib2.urlopen(request).read()
 			video_webpage = urllib2.urlopen(request).read()
 		except (urllib2.URLError, httplib.HTTPException, socket.error), err:
 		except (urllib2.URLError, httplib.HTTPException, socket.error), err:
-			sys.exit('ERROR: unable to download video: %s' % str(err))
+			self.to_stderr('ERROR: unable to download video webpage: %s' % str(err))
+			return [None]
 		self.to_stdout('[youtube] %s: Extracting video information' % video_id)
 		self.to_stdout('[youtube] %s: Extracting video information' % video_id)
 		
 		
 		# "t" param
 		# "t" param
@@ -558,5 +577,9 @@ if __name__ == '__main__':
 		retcode = fd.download(args)
 		retcode = fd.download(args)
 		sys.exit(retcode)
 		sys.exit(retcode)
 
 
+	except DownloadError:
+		sys.exit(1)
+	except SameFileError:
+		sys.exit('ERROR: fixed output name but more than one file to download')
 	except KeyboardInterrupt:
 	except KeyboardInterrupt:
 		sys.exit('\nERROR: Interrupted by user')
 		sys.exit('\nERROR: Interrupted by user')