jellyfin/MediaBrowser.Model/Net/MimeTypes.cs

199 lines
6.5 KiB
C#
Raw Normal View History

2020-02-03 19:49:27 -05:00
#pragma warning disable CS1591
using System;
2018-12-27 18:27:57 -05:00
using System.Collections.Generic;
2021-02-14 09:11:46 -05:00
using System.Diagnostics.CodeAnalysis;
2018-12-27 18:27:57 -05:00
using System.IO;
using System.Linq;
2021-09-19 14:53:31 -04:00
using Jellyfin.Extensions;
2018-12-27 18:27:57 -05:00
namespace MediaBrowser.Model.Net
{
/// <summary>
/// Class MimeTypes.
2018-12-27 18:27:57 -05:00
/// </summary>
///
2021-12-04 10:06:51 -05:00
/// <remarks>
/// For more information on MIME types:
/// <list type="bullet">
/// <item>http://en.wikipedia.org/wiki/Internet_media_type</item>
/// <item>https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types</item>
/// <item>http://www.iana.org/assignments/media-types/media-types.xhtml</item>
/// </list>
/// </remarks>
2018-12-27 18:27:57 -05:00
public static class MimeTypes
{
/// <summary>
/// Any extension in this list is considered a video file.
2018-12-27 18:27:57 -05:00
/// </summary>
2019-02-13 10:37:18 -05:00
private static readonly HashSet<string> _videoFileExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
2018-12-27 18:27:57 -05:00
{
2020-05-03 18:23:25 -04:00
".3gp",
".asf",
".avi",
".divx",
".dvr-ms",
".f4v",
".flv",
2019-02-13 10:37:18 -05:00
".img",
".iso",
2020-05-03 18:23:25 -04:00
".m2t",
".m2ts",
".m2v",
".m4v",
2019-02-13 10:37:18 -05:00
".mk3d",
2020-05-03 18:23:25 -04:00
".mkv",
2019-02-13 10:37:18 -05:00
".mov",
2020-05-03 18:23:25 -04:00
".mp4",
2019-02-13 10:37:18 -05:00
".mpg",
".mpeg",
2020-05-03 18:23:25 -04:00
".mts",
".ogg",
2019-02-13 10:37:18 -05:00
".ogm",
".ogv",
2020-05-05 11:17:03 -04:00
".rec",
2020-05-03 18:23:25 -04:00
".ts",
".rmvb",
2019-02-13 10:37:18 -05:00
".webm",
2020-05-03 18:23:25 -04:00
".wmv",
".wtv",
2019-02-13 10:37:18 -05:00
};
2018-12-27 18:27:57 -05:00
/// <summary>
/// Used for extensions not in <see cref="Model.MimeTypes"/> or to override them.
/// </summary>
2019-02-13 10:37:18 -05:00
private static readonly Dictionary<string, string> _mimeTypeLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
2018-12-27 18:27:57 -05:00
{
2019-02-13 10:37:18 -05:00
// Type application
2020-05-05 07:25:32 -04:00
{ ".azw3", "application/vnd.amazon.ebook" },
Add missing MIME types for comicbook formats (#11010) * Correct MIME types for comicbook file extensions cb7, cba, cbr, cbt and cbz all refer to different types of digital comicbooks. The last letter of the extension indicates the compression algorithm that was used: 7zip, arc, rar, tar or zip. All these filetypes used to have the `application/x-cbr` MIME type assigned to them. However, that has since been deprecated and was replaced with - `application/vnd.comicbook-rar` for rar compressed files and - `application/vnd.comicbook+zip` for rar compressed files. Only these two are officially listed by IANA https://www.iana.org/assignments/media-types/application/vnd.comicbook+zip . cbr and cbz are by far the most common file extensions for comicbooks. There's no official MIME type for cb7, cba or cbt files. However, with rar being a proprietary compression algorithm, FOSS applications will often refuse to handle files that identify themselves as `application/x-cbr`, so I decided to assign extension specific MIME types to them. I've seen these being used by other applications, specifically comic book readers. I've read through the docs on iana.org, but haven't figured out why they chose `-rar`, but `+zip`. * Add conversions from MIME type to file extensions for comicbook formats cb7, cba, cbr, cbt and cbz all refer to different types of digital comicbooks. The last letter of the extension indicates the compression algorithm that was used: 7zip, arc, rar, tar or zip. All these filetypes used to have the `application/x-cbr` MIME type assigned to them. However, that has since been deprecated and was replaced with - `application/vnd.comicbook-rar` for rar compressed files and - `application/vnd.comicbook+zip` for rar compressed files. Only these two are officially listed by IANA https://www.iana.org/assignments/media-types/application/vnd.comicbook+zip . cbr and cbz are by far the most common file extensions for comicbooks. There's no official MIME type for cb7, cba or cbt files. However, with rar being a proprietary compression algorithm, FOSS applications will often refuse to handle files that identify themselves as `application/x-cbr`, so I decided to assign extension specific MIME types to them. I've seen these being used by other applications, specifically comic book readers. * Update CONTRIBUTORS.md
2024-02-15 17:15:14 -05:00
{ ".cb7", "application/x-cb7" },
{ ".cba", "application/x-cba" },
{ ".cbr", "application/vnd.comicbook-rar" },
{ ".cbt", "application/x-cbt" },
{ ".cbz", "application/vnd.comicbook+zip" },
2019-02-13 10:37:18 -05:00
// Type image
2020-05-03 18:23:25 -04:00
{ ".tbn", "image/jpeg" },
2018-12-27 18:27:57 -05:00
2019-02-13 10:37:18 -05:00
// Type text
{ ".ass", "text/x-ssa" },
{ ".ssa", "text/x-ssa" },
2020-05-20 16:46:33 -04:00
{ ".edl", "text/plain" },
{ ".html", "text/html; charset=UTF-8" },
{ ".htm", "text/html; charset=UTF-8" },
2018-12-27 18:27:57 -05:00
2019-02-13 10:37:18 -05:00
// Type video
2020-05-03 18:23:25 -04:00
{ ".mpegts", "video/mp2t" },
2018-12-27 18:27:57 -05:00
2019-02-13 10:37:18 -05:00
// Type audio
2020-09-04 17:41:31 -04:00
{ ".aac", "audio/aac" },
2019-02-13 10:37:18 -05:00
{ ".ac3", "audio/ac3" },
2020-05-03 18:23:25 -04:00
{ ".ape", "audio/x-ape" },
2019-02-13 10:37:18 -05:00
{ ".dsf", "audio/dsf" },
{ ".dsp", "audio/dsp" },
2019-09-01 01:15:34 -04:00
{ ".flac", "audio/flac" },
2024-02-10 23:39:30 -05:00
{ ".m4b", "audio/mp4" },
2020-05-03 18:23:25 -04:00
{ ".mp3", "audio/mpeg" },
{ ".vorbis", "audio/vorbis" },
{ ".webma", "audio/webm" },
2020-04-18 01:25:54 -04:00
{ ".wv", "audio/x-wavpack" },
2020-05-03 18:23:25 -04:00
{ ".xsp", "audio/xsp" },
2019-02-13 10:37:18 -05:00
};
2018-12-27 18:27:57 -05:00
private static readonly Dictionary<string, string> _extensionLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
2018-12-27 18:27:57 -05:00
{
// Type application
Add missing MIME types for comicbook formats (#11010) * Correct MIME types for comicbook file extensions cb7, cba, cbr, cbt and cbz all refer to different types of digital comicbooks. The last letter of the extension indicates the compression algorithm that was used: 7zip, arc, rar, tar or zip. All these filetypes used to have the `application/x-cbr` MIME type assigned to them. However, that has since been deprecated and was replaced with - `application/vnd.comicbook-rar` for rar compressed files and - `application/vnd.comicbook+zip` for rar compressed files. Only these two are officially listed by IANA https://www.iana.org/assignments/media-types/application/vnd.comicbook+zip . cbr and cbz are by far the most common file extensions for comicbooks. There's no official MIME type for cb7, cba or cbt files. However, with rar being a proprietary compression algorithm, FOSS applications will often refuse to handle files that identify themselves as `application/x-cbr`, so I decided to assign extension specific MIME types to them. I've seen these being used by other applications, specifically comic book readers. I've read through the docs on iana.org, but haven't figured out why they chose `-rar`, but `+zip`. * Add conversions from MIME type to file extensions for comicbook formats cb7, cba, cbr, cbt and cbz all refer to different types of digital comicbooks. The last letter of the extension indicates the compression algorithm that was used: 7zip, arc, rar, tar or zip. All these filetypes used to have the `application/x-cbr` MIME type assigned to them. However, that has since been deprecated and was replaced with - `application/vnd.comicbook-rar` for rar compressed files and - `application/vnd.comicbook+zip` for rar compressed files. Only these two are officially listed by IANA https://www.iana.org/assignments/media-types/application/vnd.comicbook+zip . cbr and cbz are by far the most common file extensions for comicbooks. There's no official MIME type for cb7, cba or cbt files. However, with rar being a proprietary compression algorithm, FOSS applications will often refuse to handle files that identify themselves as `application/x-cbr`, so I decided to assign extension specific MIME types to them. I've seen these being used by other applications, specifically comic book readers. * Update CONTRIBUTORS.md
2024-02-15 17:15:14 -05:00
{ "application/vnd.comicbook-rar", ".cbr" },
{ "application/vnd.comicbook+zip", ".cbz" },
{ "application/x-cb7", ".cb7" },
{ "application/x-cba", ".cba" },
{ "application/x-cbr", ".cbr" },
{ "application/x-cbt", ".cbt" },
{ "application/x-cbz", ".cbz" },
{ "application/x-javascript", ".js" },
{ "application/xml", ".xml" },
{ "application/x-mpegURL", ".m3u8" },
// Type audio
{ "audio/aac", ".aac" },
{ "audio/ac3", ".ac3" },
{ "audio/dsf", ".dsf" },
{ "audio/dsp", ".dsp" },
{ "audio/flac", ".flac" },
{ "audio/m4b", ".m4b" },
{ "audio/vorbis", ".vorbis" },
{ "audio/x-ape", ".ape" },
{ "audio/xsp", ".xsp" },
{ "audio/x-wavpack", ".wv" },
2018-12-27 18:27:57 -05:00
// Type image
{ "image/jpeg", ".jpg" },
2023-01-10 11:02:23 -05:00
{ "image/tiff", ".tiff" },
{ "image/x-png", ".png" },
2023-01-10 11:02:23 -05:00
{ "image/x-icon", ".ico" },
2018-12-27 18:27:57 -05:00
// Type text
{ "text/plain", ".txt" },
{ "text/rtf", ".rtf" },
{ "text/x-ssa", ".ssa" },
2019-02-13 10:37:18 -05:00
// Type video
{ "video/vnd.mpeg.dash.mpd", ".mpd" },
{ "video/x-matroska", ".mkv" },
};
2018-12-27 18:27:57 -05:00
2021-02-14 09:11:46 -05:00
public static string GetMimeType(string path) => GetMimeType(path, "application/octet-stream");
2018-12-27 18:27:57 -05:00
/// <summary>
/// Gets the type of the MIME.
/// </summary>
/// <param name="filename">The filename to find the MIME type of.</param>
2021-09-24 14:15:10 -04:00
/// <param name="defaultValue">The default value to return if no fitting MIME type is found.</param>
2021-02-14 09:11:46 -05:00
/// <returns>The correct MIME type for the given filename, or <paramref name="defaultValue"/> if it wasn't found.</returns>
[return: NotNullIfNotNull("defaultValue")]
2021-02-14 09:11:46 -05:00
public static string? GetMimeType(string filename, string? defaultValue = null)
2018-12-27 18:27:57 -05:00
{
ArgumentException.ThrowIfNullOrEmpty(filename);
2018-12-27 18:27:57 -05:00
var ext = Path.GetExtension(filename);
2018-12-27 18:27:57 -05:00
if (_mimeTypeLookup.TryGetValue(ext, out string? result))
2018-12-27 18:27:57 -05:00
{
return result;
}
if (Model.MimeTypes.TryGetMimeType(filename, out var mimeType))
2018-12-27 18:27:57 -05:00
{
return mimeType;
2018-12-27 18:27:57 -05:00
}
// Catch-all for all video types that don't require specific mime types
if (_videoFileExtensions.Contains(ext))
2018-12-27 18:27:57 -05:00
{
return string.Concat("video/", ext.AsSpan(1));
2018-12-27 18:27:57 -05:00
}
2021-02-14 09:11:46 -05:00
return defaultValue;
2018-12-27 18:27:57 -05:00
}
public static string? ToExtension(string mimeType)
2018-12-27 18:27:57 -05:00
{
ArgumentException.ThrowIfNullOrEmpty(mimeType);
2018-12-27 18:27:57 -05:00
// handle text/html; charset=UTF-8
2021-09-19 14:53:31 -04:00
mimeType = mimeType.AsSpan().LeftPart(';').ToString();
2018-12-27 18:27:57 -05:00
if (_extensionLookup.TryGetValue(mimeType, out string? result))
2018-12-27 18:27:57 -05:00
{
return result;
}
2019-02-13 10:37:18 -05:00
var extension = Model.MimeTypes.GetMimeTypeExtensions(mimeType).FirstOrDefault();
return string.IsNullOrEmpty(extension) ? null : "." + extension;
2018-12-27 18:27:57 -05:00
}
2023-01-10 11:02:23 -05:00
public static bool IsImage(ReadOnlySpan<char> mimeType)
=> mimeType.StartsWith("image/", StringComparison.OrdinalIgnoreCase);
2018-12-27 18:27:57 -05:00
}
}