diff options
Diffstat (limited to 'MediaBrowser.Model/Net/MimeTypes.cs')
| -rw-r--r-- | MediaBrowser.Model/Net/MimeTypes.cs | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/MediaBrowser.Model/Net/MimeTypes.cs b/MediaBrowser.Model/Net/MimeTypes.cs new file mode 100644 index 000000000..d66d62fea --- /dev/null +++ b/MediaBrowser.Model/Net/MimeTypes.cs @@ -0,0 +1,346 @@ +using MediaBrowser.Model.Extensions; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace MediaBrowser.Model.Net +{ + /// <summary> + /// Class MimeTypes + /// </summary> + public static class MimeTypes + { + /// <summary> + /// Any extension in this list is considered a video file - can be added to at runtime for extensibility + /// </summary> + private static readonly string[] VideoFileExtensions = new string[] + { + ".mkv", + ".m2t", + ".m2ts", + ".img", + ".iso", + ".mk3d", + ".ts", + ".rmvb", + ".mov", + ".avi", + ".mpg", + ".mpeg", + ".wmv", + ".mp4", + ".divx", + ".dvr-ms", + ".wtv", + ".ogm", + ".ogv", + ".asf", + ".m4v", + ".flv", + ".f4v", + ".3gp", + ".webm", + ".mts", + ".m2v", + ".rec" + }; + + private static Dictionary<string, string> GetVideoFileExtensionsDictionary() + { + Dictionary<string, string> dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); + + foreach (string ext in VideoFileExtensions) + { + dict[ext] = ext; + } + + return dict; + } + + private static readonly Dictionary<string, string> VideoFileExtensionsDictionary = GetVideoFileExtensionsDictionary(); + + // http://en.wikipedia.org/wiki/Internet_media_type + // Add more as needed + + private static Dictionary<string, string> GetMimeTypeLookup() + { + Dictionary<string, string> dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); + + dict.Add(".jpg", "image/jpeg"); + dict.Add(".jpeg", "image/jpeg"); + dict.Add(".tbn", "image/jpeg"); + dict.Add(".png", "image/png"); + dict.Add(".gif", "image/gif"); + dict.Add(".tiff", "image/tiff"); + dict.Add(".webp", "image/webp"); + dict.Add(".ico", "image/vnd.microsoft.icon"); + dict.Add(".mpg", "video/mpeg"); + dict.Add(".mpeg", "video/mpeg"); + dict.Add(".ogv", "video/ogg"); + dict.Add(".mov", "video/quicktime"); + dict.Add(".webm", "video/webm"); + dict.Add(".mkv", "video/x-matroska"); + dict.Add(".wmv", "video/x-ms-wmv"); + dict.Add(".flv", "video/x-flv"); + dict.Add(".avi", "video/x-msvideo"); + dict.Add(".asf", "video/x-ms-asf"); + dict.Add(".m4v", "video/x-m4v"); + dict.Add(".m4s", "video/mp4"); + dict.Add(".cbz", "application/x-cbz"); + dict.Add(".cbr", "application/epub+zip"); + dict.Add(".epub", "application/epub+zip"); + dict.Add(".pdf", "application/pdf"); + dict.Add(".mobi", "application/x-mobipocket-ebook"); + + dict.Add(".ass", "text/x-ssa"); + dict.Add(".ssa", "text/x-ssa"); + + return dict; + } + + private static readonly Dictionary<string, string> MimeTypeLookup = GetMimeTypeLookup(); + + private static readonly Dictionary<string, string> ExtensionLookup = CreateExtensionLookup(); + + private static Dictionary<string, string> CreateExtensionLookup() + { + var dict = MimeTypeLookup + .GroupBy(i => i.Value) + .ToDictionary(x => x.Key, x => x.First().Key, StringComparer.OrdinalIgnoreCase); + + dict["image/jpg"] = ".jpg"; + dict["image/x-png"] = ".png"; + + return dict; + } + + public static string GetMimeType(string path) + { + return GetMimeType(path, true); + } + + /// <summary> + /// Gets the type of the MIME. + /// </summary> + public static string GetMimeType(string path, bool enableStreamDefault) + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentNullException("path"); + } + + var ext = Path.GetExtension(path) ?? string.Empty; + + string result; + if (MimeTypeLookup.TryGetValue(ext, out result)) + { + return result; + } + + // Type video + if (StringHelper.EqualsIgnoreCase(ext, ".3gp")) + { + return "video/3gpp"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".3g2")) + { + return "video/3gpp2"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".ts")) + { + return "video/mp2t"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".mpd")) + { + return "video/vnd.mpeg.dash.mpd"; + } + + // Catch-all for all video types that don't require specific mime types + if (VideoFileExtensionsDictionary.ContainsKey(ext)) + { + return "video/" + ext.TrimStart('.').ToLower(); + } + + // Type text + if (StringHelper.EqualsIgnoreCase(ext, ".css")) + { + return "text/css"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".csv")) + { + return "text/csv"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".html")) + { + return "text/html; charset=UTF-8"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".htm")) + { + return "text/html; charset=UTF-8"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".txt")) + { + return "text/plain"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".xml")) + { + return "application/xml"; + } + + // Type audio + if (StringHelper.EqualsIgnoreCase(ext, ".mp3")) + { + return "audio/mpeg"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".m4a")) + { + return "audio/mp4"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".aac")) + { + return "audio/mp4"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".webma")) + { + return "audio/webm"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".wav")) + { + return "audio/wav"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".wma")) + { + return "audio/x-ms-wma"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".flac")) + { + return "audio/flac"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".aac")) + { + return "audio/x-aac"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".ogg")) + { + return "audio/ogg"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".oga")) + { + return "audio/ogg"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".opus")) + { + return "audio/ogg"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".ac3")) + { + return "audio/ac3"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".dsf")) + { + return "audio/dsf"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".m4b")) + { + return "audio/m4b"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".xsp")) + { + return "audio/xsp"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".dsp")) + { + return "audio/dsp"; + } + + // Playlists + if (StringHelper.EqualsIgnoreCase(ext, ".m3u8")) + { + return "application/x-mpegURL"; + } + + // Misc + if (StringHelper.EqualsIgnoreCase(ext, ".dll")) + { + return "application/octet-stream"; + } + + // Web + if (StringHelper.EqualsIgnoreCase(ext, ".js")) + { + return "application/x-javascript"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".json")) + { + return "application/json"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".map")) + { + return "application/x-javascript"; + } + + if (StringHelper.EqualsIgnoreCase(ext, ".woff")) + { + return "font/woff"; + } + + if (StringHelper.EqualsIgnoreCase(ext, ".ttf")) + { + return "font/ttf"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".eot")) + { + return "application/vnd.ms-fontobject"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".svg")) + { + return "image/svg+xml"; + } + if (StringHelper.EqualsIgnoreCase(ext, ".svgz")) + { + return "image/svg+xml"; + } + + if (StringHelper.EqualsIgnoreCase(ext, ".srt")) + { + return "text/plain"; + } + + if (StringHelper.EqualsIgnoreCase(ext, ".vtt")) + { + return "text/vtt"; + } + + if (StringHelper.EqualsIgnoreCase(ext, ".ttml")) + { + return "application/ttml+xml"; + } + + if (enableStreamDefault) + { + return "application/octet-stream"; + } + + return null; + } + + public static string ToExtension(string mimeType) + { + if (string.IsNullOrEmpty(mimeType)) + { + throw new ArgumentNullException("mimeType"); + } + + // handle text/html; charset=UTF-8 + mimeType = mimeType.Split(';')[0]; + + string result; + if (ExtensionLookup.TryGetValue(mimeType, out result)) + { + return result; + } + return null; + } + } +} |
