Add a couple of exceptions to avoid exiting from class methods

pull/15/head
Ricardo Garcia 2008-07-22 15:52:56 +02:00 committed by Ricardo Garcia
parent 38acff0e77
commit e5bf0f551b
1 changed files with 30 additions and 7 deletions

View File

@ -25,6 +25,23 @@ std_headers = {
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):
"""File Downloader class.
@ -165,22 +182,22 @@ class FileDownloader(object):
"""Determine action to take when a download problem appears.
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
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.
"""
if message is not None:
self.to_stderr(message)
if not self._params.get('ignoreerrors', False):
sys.exit(1)
raise DownloadError(message)
return 1
def download(self, url_list):
"""Download a given list of URLs."""
retcode = 0
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:
suitable_found = False
@ -195,7 +212,7 @@ class FileDownloader(object):
retcode = self.trouble()
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:
@ -401,7 +418,8 @@ class YoutubeIE(InfoExtractor):
self.to_stdout('[youtube] Confirming age')
age_results = urllib2.urlopen(request).read()
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):
# Extract video id from URL
@ -429,7 +447,8 @@ class YoutubeIE(InfoExtractor):
self.to_stdout('[youtube] %s: Downloading video webpage' % video_id)
video_webpage = urllib2.urlopen(request).read()
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)
# "t" param
@ -558,5 +577,9 @@ if __name__ == '__main__':
retcode = fd.download(args)
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:
sys.exit('\nERROR: Interrupted by user')