diff options
-rwxr-xr-x | youtube-dl | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/youtube-dl b/youtube-dl index 3533c0f55..c7d3752dc 100755 --- a/youtube-dl +++ b/youtube-dl @@ -78,16 +78,32 @@ def htmlentity_transform(matchobj): return (u'&%s;' % entity) def sanitize_title(utitle): - """Sanitizes a video title so it could be used as part of a filename. - - This triggers different transformations based on the platform we - are running. - """ + """Sanitizes a video title so it could be used as part of a filename.""" utitle = re.sub(ur'(?u)&(.+?);', htmlentity_transform, utitle) - if sys.platform == 'win32': - utitle = re.replace(ur'<>:"\|\?\*\\', u'-', utitle) return utitle.replace(unicode(os.sep), u'%') +def sanitize_open(filename, open_mode): + """Try to open the given filename, and slightly tweak it if this fails. + + Attempts to open the given filename. If this fails, it tries to change + the filename slightly, step by step, until it's either able to open it + or it fails and raises a final exception, like the standard open() + function. + + It returns the tuple (stream, definitive_file_name). + """ + try: + stream = open(filename, open_mode) + return (stream, filename) + except (IOError, OSError), err: + # In case of error, try to remove win32 forbidden chars + filename = re.sub(ur'[<>:"\|\?\*]', u'#', filename) + + # An exception here should be caught in the caller + stream = open(filename, open_mode) + return (stream, filename) + + class DownloadError(Exception): """Download Error exception. @@ -522,7 +538,7 @@ class FileDownloader(object): # Open file just in time if stream is None: try: - stream = open(filename, open_mode) + (stream, filename) = sanitize_open(filename, open_mode) self.report_destination(filename) except (OSError, IOError), err: self.trouble('ERROR: unable to open for writing: %s' % str(err)) |