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)
 | 
						return (u'&%s;' % entity)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def sanitize_title(utitle):
 | 
					def sanitize_title(utitle):
 | 
				
			||||||
	"""Sanitizes a video title so it could be used as part of a filename.
 | 
						"""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.
 | 
					 | 
				
			||||||
	"""
 | 
					 | 
				
			||||||
	utitle = re.sub(ur'(?u)&(.+?);', htmlentity_transform, utitle)
 | 
						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'%')
 | 
						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):
 | 
					class DownloadError(Exception):
 | 
				
			||||||
	"""Download Error exception.
 | 
						"""Download Error exception.
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -522,7 +538,7 @@ class FileDownloader(object):
 | 
				
			||||||
			# Open file just in time
 | 
								# Open file just in time
 | 
				
			||||||
			if stream is None:
 | 
								if stream is None:
 | 
				
			||||||
				try:
 | 
									try:
 | 
				
			||||||
					stream = open(filename, open_mode)
 | 
										(stream, filename) = sanitize_open(filename, open_mode)
 | 
				
			||||||
					self.report_destination(filename)
 | 
										self.report_destination(filename)
 | 
				
			||||||
				except (OSError, IOError), err:
 | 
									except (OSError, IOError), err:
 | 
				
			||||||
					self.trouble('ERROR: unable to open for writing: %s' % str(err))
 | 
										self.trouble('ERROR: unable to open for writing: %s' % str(err))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue