89 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # ReMime
 | |
| ReMime is a simple IANA media types detector written in C#. It has it's own
 | |
| detectors that can be used to detect common files, and it will query the OS
 | |
| database if it exists.
 | |
| 
 | |
| ## Simplest Usage Example
 | |
| 
 | |
| The namespace for the library is `ReMime`.
 | |
| 
 | |
| ### Resolving Media Types
 | |
| ```cs
 | |
| // Will resolve by file extensions.
 | |
| MediaTypeResolver.TryResolve(pathString, out MediaType type);               // returns bool.
 | |
| MediaTypeResolver.TryResolve(fileInfo, out MediaType type, open: false);    // returns MediaTypeResult
 | |
| 
 | |
| // Will resolve using content.
 | |
| MediaTypeResolver.TryResolve(stream, out MediaType type);                   // returns bool.
 | |
| MediaTypeResolver.TryResolve(byteSpan, out MediaType type);                 // returns bool.
 | |
| 
 | |
| // Will resolve using both file extensions and content.
 | |
| MediaTypeResolver.TryResolve(pathString, stream, out MediaType type);       // returns MediaTypeResult.
 | |
| MediaTypeResolver.TryResolve(pathString, byteSpan, out MediaType type);     // returns MediaTypeResult.
 | |
| 
 | |
| MediaTypeResolver.TryResolve(stream, out MediaType type);                   // returns bool.
 | |
| MediaTypeResolver.TryResolve(byteSpan, out MediaType type);                 // returns bool.
 | |
| MediaTypeResolver.TryResolve(fileInfo, out MediaType type, open: true);     // returns MediaTypeResult
 | |
| ```
 | |
| 
 | |
| ### `MediaTypeResult` Flags
 | |
| | Value       | Explaination                                                    |
 | |
| |-------------|-----------------------------------------------------------------|
 | |
| | `None`      | Nothing matched if the value returned equals this.              |
 | |
| | `Extension` | Flag indicates the extension matched with the media type.       |
 | |
| | `Content`   | Flag indicates the file content matched with the media type.    |
 | |
| 
 | |
| ## Adding Custom Resolvers
 | |
| 
 | |
| You will need to implement the interfaces `IMediaTypeResolver` or `IMediaContentResolver`.
 | |
| The former will only resolve file extensions, whilst the latter will resolve with both file
 | |
| extensions and its contents.
 | |
| 
 | |
| Then call `MediaTypeResolver.AddResolver()` with an instance of your custom resolver.
 | |
| You can choose a resolution priority, by default the priority is 9999. ReMime resolver
 | |
| priorities begin with 1000.
 | |
| 
 | |
| ## Adding New Media Types to ReMime Resolvers
 | |
| ReMime media type resolvers are singletons under `ReMime.ContentResolvers` and `ReMime.Platform`. Currently the following resolvers are extensible:
 | |
| 
 | |
| * `ReFuel.ContentResolvers.MagicContentResolver` (implements `IMagicValueResolver`)
 | |
| * `ReFuel.ContentResolvers.RiffResolver` (implements `IMagicValueResolver`)
 | |
| 
 | |
| Classes that implement `IMagicValueResolver` have `AddMagicValue`/`AddMagicValues` methods
 | |
| that make it easy to extend.
 | |
| 
 | |
| ### `MagicValue`
 | |
| A `MagicValue` is a simple class that tries to match a specific string of bytes. It can accept standard FourCC 32-bit integers, or a string with a simple syntax.
 | |
| 
 | |
| The string syntax expects hexadecimal values by default. The hexadecimal values given
 | |
| must be byte aligned (no nibbles). Whitespace is ignored. You can start an ASCII sequence
 | |
| using the single quote `'` character. The ASCII sequence accepts single character C
 | |
| style escape sequences like `\'`.
 | |
| 
 | |
| ### `MagicValueMediaType`
 | |
| 
 | |
| This is a simple record that the built-in resolvers use.
 | |
| ```cs
 | |
| public record MagicValueMediaType(MediaType MediaType, MagicValue[] MagicValues, string[] Extensions);
 | |
| ```
 | |
| 
 | |
| Both arrays can be empty, as long as they are a non-null array. (See `Array.Empty<T>()`)
 | |
| 
 | |
| ### Using a JSON File
 | |
| ReMime includes a JSON serializer that makes it easy to configure the built-in resolvers.
 | |
| The JSON serializer will ignore comments.
 | |
| 
 | |
| ```jsonc
 | |
| [
 | |
|     // List of media type entries.
 | |
|     {
 | |
|         "type": "image/png",    // The media type key.
 | |
|         "magic": [ "89'PNG'" ], // List of magic value strings. (optional)
 | |
|         "extensions": [ "png" ] // List of file extensions strings excluding the leading dot. (also optional)
 | |
|     },
 | |
| ]
 | |
| ```
 | |
| 
 | |
| You may wish to include this database file as an embedded resource. Once you have the file
 | |
| open, you can call `MagicValueDatabaseEntry.GetEntries(str)`. This will return a `List<MagicValueMediaType>` which can be consumed by the built-in resolvers using their `AddMagicValues` methods.
 |