Add a couple of exceptions to avoid exiting from class methods

This commit is contained in:
Ricardo Garcia 2008-07-22 15:52:56 +02:00 committed by Ricardo Garcia
parent 38acff0e77
commit e5bf0f551b

View File

@ -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')