Tweak final filename in the open attempt, to be platform and filename-agnostic
This commit is contained in:
		
							parent
							
								
									c201ebc915
								
							
						
					
					
						commit
						31bcb48001
					
				
					 1 changed files with 24 additions and 8 deletions
				
			
		
							
								
								
									
										32
									
								
								youtube-dl
									
										
									
									
									
								
							
							
						
						
									
										32
									
								
								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))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue