| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | """Guess the MIME type of a file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-05-18 16:27:20 +00:00
										 |  |  | This module defines two useful functions: | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  | guess_type(url, strict=1) -- guess the MIME type and encoding of a URL. | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  | guess_extension(type, strict=1) -- guess the extension for a given MIME type. | 
					
						
							| 
									
										
										
										
											1998-05-18 16:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | It also contains the following, for tuning the behavior: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Data: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | knownfiles -- list of files to parse | 
					
						
							|  |  |  | inited -- flag set when init() has been called | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | suffix_map -- dictionary mapping suffixes to suffixes | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | encodings_map -- dictionary mapping suffixes to encodings | 
					
						
							|  |  |  | types_map -- dictionary mapping suffixes to types | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Functions: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | init([files]) -- parse a list of files, default knownfiles | 
					
						
							|  |  |  | read_mime_types(file) -- parse one file, return a dictionary or None | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | import posixpath | 
					
						
							| 
									
										
										
										
											1998-10-12 15:12:28 +00:00
										 |  |  | import urllib | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  | __all__ = [ | 
					
						
							|  |  |  |     "guess_type","guess_extension","guess_all_extensions", | 
					
						
							|  |  |  |     "add_type","read_mime_types","init" | 
					
						
							|  |  |  | ] | 
					
						
							| 
									
										
										
										
											2001-01-25 15:29:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | knownfiles = [ | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     "/etc/mime.types", | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  |     "/usr/local/etc/httpd/conf/mime.types", | 
					
						
							|  |  |  |     "/usr/local/lib/netscape/mime.types", | 
					
						
							| 
									
										
										
										
											2000-02-10 17:17:14 +00:00
										 |  |  |     "/usr/local/etc/httpd/conf/mime.types",     # Apache 1.2 | 
					
						
							|  |  |  |     "/usr/local/etc/mime.types",                # Apache 1.3 | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  | inited = False | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class MimeTypes: | 
					
						
							|  |  |  |     """MIME-types datastore.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This datastore can handle information from mime.types-style files | 
					
						
							|  |  |  |     and supports basic determination of MIME type from a filename or | 
					
						
							|  |  |  |     URL, and can guess a reasonable extension given a MIME type. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     def __init__(self, filenames=(), strict=True): | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         if not inited: | 
					
						
							|  |  |  |             init() | 
					
						
							|  |  |  |         self.encodings_map = encodings_map.copy() | 
					
						
							|  |  |  |         self.suffix_map = suffix_map.copy() | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |         self.types_map = ({}, {}) # dict for (non-strict, strict) | 
					
						
							|  |  |  |         self.types_map_inv = ({}, {}) | 
					
						
							|  |  |  |         for (ext, type) in types_map.items(): | 
					
						
							|  |  |  |             self.add_type(type, ext, True) | 
					
						
							|  |  |  |         for (ext, type) in common_types.items(): | 
					
						
							|  |  |  |             self.add_type(type, ext, False) | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         for name in filenames: | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |             self.read(name, strict) | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     def add_type(self, type, ext, strict=True): | 
					
						
							|  |  |  |         """Add a mapping between a type and and extension.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         When the extension is already known, the new | 
					
						
							|  |  |  |         type will replace the old one. When the type | 
					
						
							|  |  |  |         is already known the extension will be added | 
					
						
							|  |  |  |         to the list of known extensions. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         If strict is true, information will be added to | 
					
						
							|  |  |  |         list of standard types, else to the list of non-standard | 
					
						
							|  |  |  |         types. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         self.types_map[strict][ext] = type | 
					
						
							|  |  |  |         exts = self.types_map_inv[strict].setdefault(type, []) | 
					
						
							|  |  |  |         if ext not in exts: | 
					
						
							|  |  |  |             exts.append(ext) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def guess_type(self, url, strict=True): | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         """Guess the type of a file based on its URL.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Return value is a tuple (type, encoding) where type is None if | 
					
						
							|  |  |  |         the type can't be guessed (no or unknown suffix) or a string | 
					
						
							|  |  |  |         of the form type/subtype, usable for a MIME Content-type | 
					
						
							|  |  |  |         header; and encoding is None for no encoding or the name of | 
					
						
							|  |  |  |         the program used to encode (e.g. compress or gzip).  The | 
					
						
							|  |  |  |         mappings are table driven.  Encoding suffixes are case | 
					
						
							|  |  |  |         sensitive; type suffixes are first tried case sensitive, then | 
					
						
							|  |  |  |         case insensitive. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The suffixes .tgz, .taz and .tz (case sensitive!) are all | 
					
						
							|  |  |  |         mapped to '.tar.gz'.  (This is table-driven too, using the | 
					
						
							|  |  |  |         dictionary suffix_map.) | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |         Optional `strict' argument when False adds a bunch of commonly found, | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |         but non-standard types. | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         scheme, url = urllib.splittype(url) | 
					
						
							|  |  |  |         if scheme == 'data': | 
					
						
							|  |  |  |             # syntax of data URLs: | 
					
						
							|  |  |  |             # dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data | 
					
						
							|  |  |  |             # mediatype := [ type "/" subtype ] *( ";" parameter ) | 
					
						
							|  |  |  |             # data      := *urlchar | 
					
						
							|  |  |  |             # parameter := attribute "=" value | 
					
						
							|  |  |  |             # type/subtype defaults to "text/plain" | 
					
						
							|  |  |  |             comma = url.find(',') | 
					
						
							|  |  |  |             if comma < 0: | 
					
						
							|  |  |  |                 # bad data URL | 
					
						
							|  |  |  |                 return None, None | 
					
						
							|  |  |  |             semi = url.find(';', 0, comma) | 
					
						
							|  |  |  |             if semi >= 0: | 
					
						
							|  |  |  |                 type = url[:semi] | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 type = url[:comma] | 
					
						
							|  |  |  |             if '=' in type or '/' not in type: | 
					
						
							|  |  |  |                 type = 'text/plain' | 
					
						
							|  |  |  |             return type, None           # never compressed, so encoding is None | 
					
						
							|  |  |  |         base, ext = posixpath.splitext(url) | 
					
						
							| 
									
										
										
										
											2002-06-01 14:18:47 +00:00
										 |  |  |         while ext in self.suffix_map: | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |             base, ext = posixpath.splitext(base + self.suffix_map[ext]) | 
					
						
							| 
									
										
										
										
											2002-06-01 14:18:47 +00:00
										 |  |  |         if ext in self.encodings_map: | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |             encoding = self.encodings_map[ext] | 
					
						
							|  |  |  |             base, ext = posixpath.splitext(base) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             encoding = None | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |         types_map = self.types_map[True] | 
					
						
							| 
									
										
										
										
											2002-06-01 14:18:47 +00:00
										 |  |  |         if ext in types_map: | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |             return types_map[ext], encoding | 
					
						
							| 
									
										
										
										
											2002-06-01 14:18:47 +00:00
										 |  |  |         elif ext.lower() in types_map: | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |             return types_map[ext.lower()], encoding | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |         elif strict: | 
					
						
							|  |  |  |             return None, encoding | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |         types_map = self.types_map[False] | 
					
						
							|  |  |  |         if ext in types_map: | 
					
						
							|  |  |  |             return types_map[ext], encoding | 
					
						
							|  |  |  |         elif ext.lower() in types_map: | 
					
						
							|  |  |  |             return types_map[ext.lower()], encoding | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             return None, encoding | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     def guess_all_extensions(self, type, strict=True): | 
					
						
							|  |  |  |         """Guess the extensions for a file based on its MIME type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Return value is a list of strings giving the possible filename | 
					
						
							|  |  |  |         extensions, including the leading dot ('.').  The extension is not | 
					
						
							|  |  |  |         guaranteed to have been associated with any particular data | 
					
						
							|  |  |  |         stream, but would be mapped to the MIME type `type' by | 
					
						
							|  |  |  |         guess_type().  If no extension can be guessed for `type', None | 
					
						
							|  |  |  |         is returned. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Optional `strict' argument when false adds a bunch of commonly found, | 
					
						
							|  |  |  |         but non-standard types. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         type = type.lower() | 
					
						
							|  |  |  |         extensions = self.types_map_inv[True].get(type, []) | 
					
						
							|  |  |  |         if not strict: | 
					
						
							|  |  |  |             for ext in self.types_map_inv[False].get(type, []): | 
					
						
							|  |  |  |                 if ext not in extensions: | 
					
						
							|  |  |  |                     extensions.append(ext) | 
					
						
							|  |  |  |         if len(extensions): | 
					
						
							|  |  |  |             return extensions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def guess_extension(self, type, strict=True): | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         """Guess the extension for a file based on its MIME type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Return value is a string giving a filename extension, | 
					
						
							|  |  |  |         including the leading dot ('.').  The extension is not | 
					
						
							|  |  |  |         guaranteed to have been associated with any particular data | 
					
						
							|  |  |  |         stream, but would be mapped to the MIME type `type' by | 
					
						
							|  |  |  |         guess_type().  If no extension can be guessed for `type', None | 
					
						
							|  |  |  |         is returned. | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Optional `strict' argument when false adds a bunch of commonly found, | 
					
						
							|  |  |  |         but non-standard types. | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |         extensions = self.guess_all_extensions(type, strict) | 
					
						
							|  |  |  |         if extensions is not None: | 
					
						
							|  |  |  |             extensions = extensions[0] | 
					
						
							|  |  |  |         return extensions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def read(self, filename, strict=True): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Read a single mime.types-format file, specified by pathname. | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |         If strict is true, information will be added to | 
					
						
							|  |  |  |         list of standard types, else to the list of non-standard | 
					
						
							|  |  |  |         types. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         fp = open(filename) | 
					
						
							| 
									
										
										
										
											2003-01-03 21:02:36 +00:00
										 |  |  |         self.readfp(fp, strict) | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         fp.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     def readfp(self, fp, strict=True): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Read a single mime.types-format file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         If strict is true, information will be added to | 
					
						
							|  |  |  |         list of standard types, else to the list of non-standard | 
					
						
							|  |  |  |         types. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |         while 1: | 
					
						
							| 
									
										
										
										
											2001-08-16 15:54:28 +00:00
										 |  |  |             line = fp.readline() | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |             if not line: | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             words = line.split() | 
					
						
							|  |  |  |             for i in range(len(words)): | 
					
						
							|  |  |  |                 if words[i][0] == '#': | 
					
						
							|  |  |  |                     del words[i:] | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |             if not words: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             type, suffixes = words[0], words[1:] | 
					
						
							|  |  |  |             for suff in suffixes: | 
					
						
							| 
									
										
										
										
											2003-01-03 21:06:46 +00:00
										 |  |  |                 self.add_type(type, '.' + suff, strict) | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  | def guess_type(url, strict=True): | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  |     """Guess the type of a file based on its URL.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Return value is a tuple (type, encoding) where type is None if the | 
					
						
							|  |  |  |     type can't be guessed (no or unknown suffix) or a string of the | 
					
						
							|  |  |  |     form type/subtype, usable for a MIME Content-type header; and | 
					
						
							|  |  |  |     encoding is None for no encoding or the name of the program used | 
					
						
							|  |  |  |     to encode (e.g. compress or gzip).  The mappings are table | 
					
						
							|  |  |  |     driven.  Encoding suffixes are case sensitive; type suffixes are | 
					
						
							|  |  |  |     first tried case sensitive, then case insensitive. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The suffixes .tgz, .taz and .tz (case sensitive!) are all mapped | 
					
						
							|  |  |  |     to ".tar.gz".  (This is table-driven too, using the dictionary | 
					
						
							| 
									
										
										
										
											1998-05-18 16:05:24 +00:00
										 |  |  |     suffix_map). | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Optional `strict' argument when false adds a bunch of commonly found, but | 
					
						
							|  |  |  |     non-standard types. | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |     init() | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     return guess_type(url, strict) | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  | def guess_all_extensions(type, strict=True): | 
					
						
							|  |  |  |     """Guess the extensions for a file based on its MIME type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Return value is a list of strings giving the possible filename | 
					
						
							|  |  |  |     extensions, including the leading dot ('.').  The extension is not | 
					
						
							|  |  |  |     guaranteed to have been associated with any particular data | 
					
						
							|  |  |  |     stream, but would be mapped to the MIME type `type' by | 
					
						
							|  |  |  |     guess_type().  If no extension can be guessed for `type', None | 
					
						
							|  |  |  |     is returned. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Optional `strict' argument when false adds a bunch of commonly found, | 
					
						
							|  |  |  |     but non-standard types. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     init() | 
					
						
							|  |  |  |     return guess_all_extensions(type, strict) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def guess_extension(type, strict=True): | 
					
						
							| 
									
										
										
										
											1998-05-18 16:27:20 +00:00
										 |  |  |     """Guess the extension for a file based on its MIME type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Return value is a string giving a filename extension, including the | 
					
						
							|  |  |  |     leading dot ('.').  The extension is not guaranteed to have been | 
					
						
							| 
									
										
										
										
											1998-05-19 15:15:59 +00:00
										 |  |  |     associated with any particular data stream, but would be mapped to the | 
					
						
							|  |  |  |     MIME type `type' by guess_type().  If no extension can be guessed for | 
					
						
							|  |  |  |     `type', None is returned. | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Optional `strict' argument when false adds a bunch of commonly found, | 
					
						
							|  |  |  |     but non-standard types. | 
					
						
							| 
									
										
										
										
											1998-05-18 16:27:20 +00:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |     init() | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     return guess_extension(type, strict) | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  | def add_type(self, type, ext, strict=True): | 
					
						
							|  |  |  |     """Add a mapping between a type and and extension.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     When the extension is already known, the new | 
					
						
							|  |  |  |     type will replace the old one. When the type | 
					
						
							|  |  |  |     is already known the extension will be added | 
					
						
							|  |  |  |     to the list of known extensions. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If strict is true, information will be added to | 
					
						
							|  |  |  |     list of standard types, else to the list of non-standard | 
					
						
							|  |  |  |     types. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     init() | 
					
						
							|  |  |  |     return add_type(type, ext, strict) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-05-18 16:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | def init(files=None): | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     global guess_all_extensions, guess_extension, guess_type | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     global suffix_map, types_map, encodings_map, common_types | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     global add_type, inited | 
					
						
							|  |  |  |     inited = True | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |     db = MimeTypes() | 
					
						
							|  |  |  |     if files is None: | 
					
						
							|  |  |  |         files = knownfiles | 
					
						
							|  |  |  |     for file in files: | 
					
						
							|  |  |  |         if os.path.isfile(file): | 
					
						
							|  |  |  |             db.readfp(open(file)) | 
					
						
							|  |  |  |     encodings_map = db.encodings_map | 
					
						
							| 
									
										
										
										
											2001-08-16 18:14:38 +00:00
										 |  |  |     suffix_map = db.suffix_map | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     types_map = db.types_map[True] | 
					
						
							|  |  |  |     guess_all_extensions = db.guess_all_extensions | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |     guess_extension = db.guess_extension | 
					
						
							|  |  |  |     guess_type = db.guess_type | 
					
						
							| 
									
										
										
										
											2002-09-06 16:15:58 +00:00
										 |  |  |     add_type = db.add_type | 
					
						
							|  |  |  |     common_types = db.types_map[False] | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def read_mime_types(file): | 
					
						
							|  |  |  |     try: | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         f = open(file) | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  |     except IOError: | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         return None | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |     db = MimeTypes() | 
					
						
							| 
									
										
										
										
											2003-01-03 19:33:17 +00:00
										 |  |  |     db.readfp(f, True) | 
					
						
							|  |  |  |     return db.types_map[True] | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | suffix_map = { | 
					
						
							|  |  |  |     '.tgz': '.tar.gz', | 
					
						
							|  |  |  |     '.taz': '.tar.gz', | 
					
						
							|  |  |  |     '.tz': '.tar.gz', | 
					
						
							| 
									
										
										
										
											2001-08-03 21:01:44 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | encodings_map = { | 
					
						
							|  |  |  |     '.gz': 'gzip', | 
					
						
							|  |  |  |     '.Z': 'compress', | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-07 16:49:12 +00:00
										 |  |  | # Before adding new types, make sure they are either registered with IANA, at | 
					
						
							|  |  |  | # http://www.isi.edu/in-notes/iana/assignments/media-types | 
					
						
							|  |  |  | # or extensions, i.e. using the x- prefix | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # If you add to these, please keep them sorted! | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  | types_map = { | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     '.a'      : 'application/octet-stream', | 
					
						
							|  |  |  |     '.ai'     : 'application/postscript', | 
					
						
							|  |  |  |     '.aif'    : 'audio/x-aiff', | 
					
						
							|  |  |  |     '.aifc'   : 'audio/x-aiff', | 
					
						
							|  |  |  |     '.aiff'   : 'audio/x-aiff', | 
					
						
							|  |  |  |     '.au'     : 'audio/basic', | 
					
						
							|  |  |  |     '.avi'    : 'video/x-msvideo', | 
					
						
							|  |  |  |     '.bat'    : 'text/plain', | 
					
						
							|  |  |  |     '.bcpio'  : 'application/x-bcpio', | 
					
						
							|  |  |  |     '.bin'    : 'application/octet-stream', | 
					
						
							|  |  |  |     '.bmp'    : 'image/x-ms-bmp', | 
					
						
							|  |  |  |     '.c'      : 'text/plain', | 
					
						
							|  |  |  |     # Duplicates :( | 
					
						
							|  |  |  |     '.cdf'    : 'application/x-cdf', | 
					
						
							|  |  |  |     '.cdf'    : 'application/x-netcdf', | 
					
						
							|  |  |  |     '.cpio'   : 'application/x-cpio', | 
					
						
							|  |  |  |     '.csh'    : 'application/x-csh', | 
					
						
							|  |  |  |     '.css'    : 'text/css', | 
					
						
							|  |  |  |     '.dll'    : 'application/octet-stream', | 
					
						
							|  |  |  |     '.doc'    : 'application/msword', | 
					
						
							|  |  |  |     '.dot'    : 'application/msword', | 
					
						
							|  |  |  |     '.dvi'    : 'application/x-dvi', | 
					
						
							|  |  |  |     '.eml'    : 'message/rfc822', | 
					
						
							|  |  |  |     '.eps'    : 'application/postscript', | 
					
						
							|  |  |  |     '.etx'    : 'text/x-setext', | 
					
						
							|  |  |  |     '.exe'    : 'application/octet-stream', | 
					
						
							|  |  |  |     '.gif'    : 'image/gif', | 
					
						
							|  |  |  |     '.gtar'   : 'application/x-gtar', | 
					
						
							|  |  |  |     '.h'      : 'text/plain', | 
					
						
							|  |  |  |     '.hdf'    : 'application/x-hdf', | 
					
						
							|  |  |  |     '.htm'    : 'text/html', | 
					
						
							|  |  |  |     '.html'   : 'text/html', | 
					
						
							|  |  |  |     '.ief'    : 'image/ief', | 
					
						
							|  |  |  |     '.jpe'    : 'image/jpeg', | 
					
						
							|  |  |  |     '.jpeg'   : 'image/jpeg', | 
					
						
							|  |  |  |     '.jpg'    : 'image/jpeg', | 
					
						
							|  |  |  |     '.js'     : 'application/x-javascript', | 
					
						
							|  |  |  |     '.ksh'    : 'text/plain', | 
					
						
							|  |  |  |     '.latex'  : 'application/x-latex', | 
					
						
							|  |  |  |     '.m1v'    : 'video/mpeg', | 
					
						
							|  |  |  |     '.man'    : 'application/x-troff-man', | 
					
						
							|  |  |  |     '.me'     : 'application/x-troff-me', | 
					
						
							|  |  |  |     '.mht'    : 'message/rfc822', | 
					
						
							|  |  |  |     '.mhtml'  : 'message/rfc822', | 
					
						
							|  |  |  |     '.mif'    : 'application/x-mif', | 
					
						
							|  |  |  |     '.mov'    : 'video/quicktime', | 
					
						
							|  |  |  |     '.movie'  : 'video/x-sgi-movie', | 
					
						
							|  |  |  |     '.mp2'    : 'audio/mpeg', | 
					
						
							|  |  |  |     '.mp3'    : 'audio/mpeg', | 
					
						
							|  |  |  |     '.mpa'    : 'video/mpeg', | 
					
						
							|  |  |  |     '.mpe'    : 'video/mpeg', | 
					
						
							|  |  |  |     '.mpeg'   : 'video/mpeg', | 
					
						
							|  |  |  |     '.mpg'    : 'video/mpeg', | 
					
						
							|  |  |  |     '.ms'     : 'application/x-troff-ms', | 
					
						
							|  |  |  |     '.nc'     : 'application/x-netcdf', | 
					
						
							|  |  |  |     '.nws'    : 'message/rfc822', | 
					
						
							|  |  |  |     '.o'      : 'application/octet-stream', | 
					
						
							|  |  |  |     '.obj'    : 'application/octet-stream', | 
					
						
							|  |  |  |     '.oda'    : 'application/oda', | 
					
						
							|  |  |  |     '.p12'    : 'application/x-pkcs12', | 
					
						
							|  |  |  |     '.p7c'    : 'application/pkcs7-mime', | 
					
						
							|  |  |  |     '.pbm'    : 'image/x-portable-bitmap', | 
					
						
							|  |  |  |     '.pdf'    : 'application/pdf', | 
					
						
							|  |  |  |     '.pfx'    : 'application/x-pkcs12', | 
					
						
							|  |  |  |     '.pgm'    : 'image/x-portable-graymap', | 
					
						
							|  |  |  |     '.pl'     : 'text/plain', | 
					
						
							|  |  |  |     '.png'    : 'image/png', | 
					
						
							|  |  |  |     '.pnm'    : 'image/x-portable-anymap', | 
					
						
							|  |  |  |     '.pot'    : 'application/vnd.ms-powerpoint', | 
					
						
							|  |  |  |     '.ppa'    : 'application/vnd.ms-powerpoint', | 
					
						
							|  |  |  |     '.ppm'    : 'image/x-portable-pixmap', | 
					
						
							|  |  |  |     '.pps'    : 'application/vnd.ms-powerpoint', | 
					
						
							|  |  |  |     '.ppt'    : 'application/vnd.ms-powerpoint', | 
					
						
							|  |  |  |     '.ps'     : 'application/postscript', | 
					
						
							|  |  |  |     '.pwz'    : 'application/vnd.ms-powerpoint', | 
					
						
							|  |  |  |     '.py'     : 'text/x-python', | 
					
						
							|  |  |  |     '.pyc'    : 'application/x-python-code', | 
					
						
							|  |  |  |     '.pyo'    : 'application/x-python-code', | 
					
						
							|  |  |  |     '.qt'     : 'video/quicktime', | 
					
						
							|  |  |  |     '.ra'     : 'audio/x-pn-realaudio', | 
					
						
							|  |  |  |     '.ram'    : 'application/x-pn-realaudio', | 
					
						
							|  |  |  |     '.ras'    : 'image/x-cmu-raster', | 
					
						
							|  |  |  |     '.rdf'    : 'application/xml', | 
					
						
							|  |  |  |     '.rgb'    : 'image/x-rgb', | 
					
						
							|  |  |  |     '.roff'   : 'application/x-troff', | 
					
						
							|  |  |  |     '.rtx'    : 'text/richtext', | 
					
						
							|  |  |  |     '.sgm'    : 'text/x-sgml', | 
					
						
							|  |  |  |     '.sgml'   : 'text/x-sgml', | 
					
						
							|  |  |  |     '.sh'     : 'application/x-sh', | 
					
						
							|  |  |  |     '.shar'   : 'application/x-shar', | 
					
						
							|  |  |  |     '.snd'    : 'audio/basic', | 
					
						
							|  |  |  |     '.so'     : 'application/octet-stream', | 
					
						
							|  |  |  |     '.src'    : 'application/x-wais-source', | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  |     '.sv4cpio': 'application/x-sv4cpio', | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     '.sv4crc' : 'application/x-sv4crc', | 
					
						
							| 
									
										
										
										
											2003-01-04 14:11:38 +00:00
										 |  |  |     '.swf'    : 'application/x-shockwave-flash', | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     '.t'      : 'application/x-troff', | 
					
						
							|  |  |  |     '.tar'    : 'application/x-tar', | 
					
						
							|  |  |  |     '.tcl'    : 'application/x-tcl', | 
					
						
							|  |  |  |     '.tex'    : 'application/x-tex', | 
					
						
							|  |  |  |     '.texi'   : 'application/x-texinfo', | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  |     '.texinfo': 'application/x-texinfo', | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     '.tif'    : 'image/tiff', | 
					
						
							|  |  |  |     '.tiff'   : 'image/tiff', | 
					
						
							|  |  |  |     '.tr'     : 'application/x-troff', | 
					
						
							|  |  |  |     '.tsv'    : 'text/tab-separated-values', | 
					
						
							|  |  |  |     '.txt'    : 'text/plain', | 
					
						
							|  |  |  |     '.ustar'  : 'application/x-ustar', | 
					
						
							|  |  |  |     '.vcf'    : 'text/x-vcard', | 
					
						
							|  |  |  |     '.wav'    : 'audio/x-wav', | 
					
						
							|  |  |  |     '.wiz'    : 'application/msword', | 
					
						
							|  |  |  |     '.xbm'    : 'image/x-xbitmap', | 
					
						
							|  |  |  |     '.xlb'    : 'application/vnd.ms-excel', | 
					
						
							|  |  |  |     # Duplicates :( | 
					
						
							|  |  |  |     '.xls'    : 'application/excel', | 
					
						
							|  |  |  |     '.xls'    : 'application/vnd.ms-excel', | 
					
						
							|  |  |  |     '.xml'    : 'text/xml', | 
					
						
							|  |  |  |     '.xpm'    : 'image/x-xpixmap', | 
					
						
							|  |  |  |     '.xsl'    : 'application/xml', | 
					
						
							|  |  |  |     '.xwd'    : 'image/x-xwindowdump', | 
					
						
							|  |  |  |     '.zip'    : 'application/zip', | 
					
						
							| 
									
										
										
										
											1997-09-30 19:05:50 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-02-09 09:44:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  | # These are non-standard types, commonly found in the wild.  They will only | 
					
						
							|  |  |  | # match if strict=0 flag is given to the API methods. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Please sort these too | 
					
						
							|  |  |  | common_types = { | 
					
						
							|  |  |  |     '.jpg' : 'image/jpg', | 
					
						
							|  |  |  |     '.mid' : 'audio/midi', | 
					
						
							|  |  |  |     '.midi': 'audio/midi', | 
					
						
							|  |  |  |     '.pct' : 'image/pict', | 
					
						
							|  |  |  |     '.pic' : 'image/pict', | 
					
						
							|  |  |  |     '.pict': 'image/pict', | 
					
						
							|  |  |  |     '.rtf' : 'application/rtf', | 
					
						
							|  |  |  |     '.xul' : 'text/xul' | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-09 09:44:47 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     import sys | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     import getopt | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-05 15:58:29 +00:00
										 |  |  |     USAGE = """\
 | 
					
						
							|  |  |  | Usage: mimetypes.py [options] type | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Options: | 
					
						
							|  |  |  |     --help / -h       -- print this message and exit | 
					
						
							|  |  |  |     --lenient / -l    -- additionally search of some common, but non-standard | 
					
						
							|  |  |  |                          types. | 
					
						
							|  |  |  |     --extension / -e  -- guess extension instead of type | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | More than one type argument may be given. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def usage(code, msg=''): | 
					
						
							|  |  |  |         print USAGE | 
					
						
							|  |  |  |         if msg: print msg | 
					
						
							|  |  |  |         sys.exit(code) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Applying proposed patch for bug #474583, optional support for
non-standard but common types.  Including Martin's suggestion to add
rejected non-standard types from patch #438790.  Specifically,
guess_type(), guess_extension(): Both the functions and the methods
grow an optional "strict" flag, defaulting to true, which determines
whether to recognize non-standard, but commonly found types or not.
Also, I sorted, reformatted, and culled duplicates from the big
types_map dictionary.  Note that there are a few non-equivalent
duplicates (e.g. .cdf and .xls) for which the first will just get
thrown away.  I didn't remove those though.
Finally, use of the module as a script as grown the -l and -e options
to toggle strictness and to do guess_extension(), respectively.
Doc and unittest updates too.
											
										 
											2001-10-25 21:49:18 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         opts, args = getopt.getopt(sys.argv[1:], 'hle', | 
					
						
							|  |  |  |                                    ['help', 'lenient', 'extension']) | 
					
						
							|  |  |  |     except getopt.error, msg: | 
					
						
							|  |  |  |         usage(1, msg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     strict = 1 | 
					
						
							|  |  |  |     extension = 0 | 
					
						
							|  |  |  |     for opt, arg in opts: | 
					
						
							|  |  |  |         if opt in ('-h', '--help'): | 
					
						
							|  |  |  |             usage(0) | 
					
						
							|  |  |  |         elif opt in ('-l', '--lenient'): | 
					
						
							|  |  |  |             strict = 0 | 
					
						
							|  |  |  |         elif opt in ('-e', '--extension'): | 
					
						
							|  |  |  |             extension = 1 | 
					
						
							|  |  |  |     for gtype in args: | 
					
						
							|  |  |  |         if extension: | 
					
						
							|  |  |  |             guess = guess_extension(gtype, strict) | 
					
						
							|  |  |  |             if not guess: print "I don't know anything about type", gtype | 
					
						
							|  |  |  |             else: print guess | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             guess, encoding = guess_type(gtype, strict) | 
					
						
							|  |  |  |             if not guess: print "I don't know anything about type", gtype | 
					
						
							|  |  |  |             else: print 'type:', guess, 'encoding:', encoding |