diff --git a/src/Util/MIMETypeUtil.h b/src/Util/MIMETypeUtil.h index 611d509c9..52e950a7c 100644 --- a/src/Util/MIMETypeUtil.h +++ b/src/Util/MIMETypeUtil.h @@ -46,6 +46,7 @@ extern NSString *const OWSMimeTypeUnknownForTests; + (nullable NSString *)utiTypeForFileExtension:(NSString *)fileExtension; + (nullable NSString *)fileExtensionForUTIType:(NSString *)utiType; + (nullable NSString *)fileExtensionForMIMEType:(NSString *)mimeType; ++ (nullable NSString *)mimeTypeForFileExtension:(NSString *)fileExtension; @end diff --git a/src/Util/MIMETypeUtil.m b/src/Util/MIMETypeUtil.m index 1979e6bab..fa3c5a717 100644 --- a/src/Util/MIMETypeUtil.m +++ b/src/Util/MIMETypeUtil.m @@ -398,9 +398,24 @@ NSString *const OWSMimeTypeUnknownForTests = @"unknown/mimetype"; + (nullable NSString *)utiTypeForMIMEType:(NSString *)mimeType { - CFStringRef utiType - = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (__bridge CFStringRef)mimeType, NULL); - return (__bridge_transfer NSString *)utiType; + NSString *utiType = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag( + kUTTagClassMIMEType, (__bridge CFStringRef)mimeType, NULL); + + if (!utiType) { + if ([mimeType isEqualToString:@"audio/amr"]) { + utiType = @"org.3gpp.adaptive-multi-rate-audio"; + } else if ([mimeType isEqualToString:@"audio/mp3"] || [mimeType isEqualToString:@"audio/x-mpeg"] || + [mimeType isEqualToString:@"audio/mpeg"] || [mimeType isEqualToString:@"audio/mpeg3"] || + [mimeType isEqualToString:@"audio/x-mp3"] || [mimeType isEqualToString:@"audio/x-mpeg3"]) { + utiType = (NSString *)kUTTypeMP3; + } else if ([mimeType isEqualToString:@"audio/aac"] || [mimeType isEqualToString:@"audio/x-m4a"]) { + utiType = (NSString *)kUTTypeMPEG4Audio; + } else if ([mimeType isEqualToString:@"audio/aiff"] || [mimeType isEqualToString:@"audio/x-aiff"]) { + utiType = (NSString *)kUTTypeAudioInterchangeFileFormat; + } + } + + return utiType; } + (nullable NSString *)fileExtensionForUTIType:(NSString *)utiType @@ -1546,6 +1561,1006 @@ NSString *const OWSMimeTypeUnknownForTests = @"unknown/mimetype"; return result; } ++ (nullable NSString *)mimeTypeForFileExtension:(NSString *)fileExtension +{ + OWSAssert(fileExtension.length > 0); + + return [self genericExtensionTypesToMIMETypes][fileExtension]; +} + ++ (NSDictionary *)genericExtensionTypesToMIMETypes +{ + static NSDictionary *result = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + result = @{ + @"123" : @"application/vnd.lotus-1-2-3", + @"3dml" : @"text/vnd.in3d.3dml", + @"3ds" : @"image/x-3ds", + @"3g2" : @"video/3gpp2", + @"3gp" : @"video/3gpp", + @"7z" : @"application/x-7z-compressed", + @"aab" : @"application/x-authorware-bin", + @"aac" : @"audio/x-aac", + @"aam" : @"application/x-authorware-map", + @"aas" : @"application/x-authorware-seg", + @"abw" : @"application/x-abiword", + @"ac" : @"application/pkix-attr-cert", + @"acc" : @"application/vnd.americandynamics.acc", + @"ace" : @"application/x-ace-compressed", + @"acu" : @"application/vnd.acucobol", + @"acutc" : @"application/vnd.acucorp", + @"adp" : @"audio/adpcm", + @"aep" : @"application/vnd.audiograph", + @"afm" : @"application/x-font-type1", + @"afp" : @"application/vnd.ibm.modcap", + @"ahead" : @"application/vnd.ahead.space", + @"ai" : @"application/postscript", + @"aif" : @"audio/x-aiff", + @"aifc" : @"audio/x-aiff", + @"aiff" : @"audio/x-aiff", + @"air" : @"application/vnd.adobe.air-application-installer-package+zip", + @"ait" : @"application/vnd.dvb.ait", + @"ami" : @"application/vnd.amiga.ami", + @"apk" : @"application/vnd.android.package-archive", + @"appcache" : @"text/cache-manifest", + @"application" : @"application/x-ms-application", + @"apr" : @"application/vnd.lotus-approach", + @"arc" : @"application/x-freearc", + @"asc" : @"application/pgp-signature", + @"asf" : @"video/x-ms-asf", + @"asm" : @"text/x-asm", + @"aso" : @"application/vnd.accpac.simply.aso", + @"asx" : @"video/x-ms-asf", + @"atc" : @"application/vnd.acucorp", + @"atom" : @"application/atom+xml", + @"atomcat" : @"application/atomcat+xml", + @"atomsvc" : @"application/atomsvc+xml", + @"atx" : @"application/vnd.antix.game-component", + @"au" : @"audio/basic", + @"avi" : @"video/x-msvideo", + @"aw" : @"application/applixware", + @"azf" : @"application/vnd.airzip.filesecure.azf", + @"azs" : @"application/vnd.airzip.filesecure.azs", + @"azw" : @"application/vnd.amazon.ebook", + @"bat" : @"application/x-msdownload", + @"bcpio" : @"application/x-bcpio", + @"bdf" : @"application/x-font-bdf", + @"bdm" : @"application/vnd.syncml.dm+wbxml", + @"bed" : @"application/vnd.realvnc.bed", + @"bh2" : @"application/vnd.fujitsu.oasysprs", + @"bin" : @"application/octet-stream", + @"blb" : @"application/x-blorb", + @"blorb" : @"application/x-blorb", + @"bmi" : @"application/vnd.bmi", + @"bmp" : @"image/bmp", + @"book" : @"application/vnd.framemaker", + @"box" : @"application/vnd.previewsystems.box", + @"boz" : @"application/x-bzip2", + @"bpk" : @"application/octet-stream", + @"btif" : @"image/prs.btif", + @"bz" : @"application/x-bzip", + @"bz2" : @"application/x-bzip2", + @"c" : @"text/x-c", + @"c11amc" : @"application/vnd.cluetrust.cartomobile-config", + @"c11amz" : @"application/vnd.cluetrust.cartomobile-config-pkg", + @"c4d" : @"application/vnd.clonk.c4group", + @"c4f" : @"application/vnd.clonk.c4group", + @"c4g" : @"application/vnd.clonk.c4group", + @"c4p" : @"application/vnd.clonk.c4group", + @"c4u" : @"application/vnd.clonk.c4group", + @"cab" : @"application/vnd.ms-cab-compressed", + @"caf" : @"audio/x-caf", + @"cap" : @"application/vnd.tcpdump.pcap", + @"car" : @"application/vnd.curl.car", + @"cat" : @"application/vnd.ms-pki.seccat", + @"cb7" : @"application/x-cbr", + @"cba" : @"application/x-cbr", + @"cbr" : @"application/x-cbr", + @"cbt" : @"application/x-cbr", + @"cbz" : @"application/x-cbr", + @"cc" : @"text/x-c", + @"cct" : @"application/x-director", + @"ccxml" : @"application/ccxml+xml", + @"cdbcmsg" : @"application/vnd.contact.cmsg", + @"cdf" : @"application/x-netcdf", + @"cdkey" : @"application/vnd.mediastation.cdkey", + @"cdmia" : @"application/cdmi-capability", + @"cdmic" : @"application/cdmi-container", + @"cdmid" : @"application/cdmi-domain", + @"cdmio" : @"application/cdmi-object", + @"cdmiq" : @"application/cdmi-queue", + @"cdx" : @"chemical/x-cdx", + @"cdxml" : @"application/vnd.chemdraw+xml", + @"cdy" : @"application/vnd.cinderella", + @"cer" : @"application/pkix-cert", + @"cfs" : @"application/x-cfs-compressed", + @"cgm" : @"image/cgm", + @"chat" : @"application/x-chat", + @"chm" : @"application/vnd.ms-htmlhelp", + @"chrt" : @"application/vnd.kde.kchart", + @"cif" : @"chemical/x-cif", + @"cii" : @"application/vnd.anser-web-certificate-issue-initiation", + @"cil" : @"application/vnd.ms-artgalry", + @"cla" : @"application/vnd.claymore", + @"class" : @"application/java-vm", + @"clkk" : @"application/vnd.crick.clicker.keyboard", + @"clkp" : @"application/vnd.crick.clicker.palette", + @"clkt" : @"application/vnd.crick.clicker.template", + @"clkw" : @"application/vnd.crick.clicker.wordbank", + @"clkx" : @"application/vnd.crick.clicker", + @"clp" : @"application/x-msclip", + @"cmc" : @"application/vnd.cosmocaller", + @"cmdf" : @"chemical/x-cmdf", + @"cml" : @"chemical/x-cml", + @"cmp" : @"application/vnd.yellowriver-custom-menu", + @"cmx" : @"image/x-cmx", + @"cod" : @"application/vnd.rim.cod", + @"com" : @"application/x-msdownload", + @"conf" : @"text/plain", + @"cpio" : @"application/x-cpio", + @"cpp" : @"text/x-c", + @"cpt" : @"application/mac-compactpro", + @"crd" : @"application/x-mscardfile", + @"crl" : @"application/pkix-crl", + @"crt" : @"application/x-x509-ca-cert", + @"cryptonote" : @"application/vnd.rig.cryptonote", + @"csh" : @"application/x-csh", + @"csml" : @"chemical/x-csml", + @"csp" : @"application/vnd.commonspace", + @"css" : @"text/css", + @"cst" : @"application/x-director", + @"csv" : @"text/csv", + @"cu" : @"application/cu-seeme", + @"curl" : @"text/vnd.curl", + @"cww" : @"application/prs.cww", + @"cxt" : @"application/x-director", + @"cxx" : @"text/x-c", + @"dae" : @"model/vnd.collada+xml", + @"daf" : @"application/vnd.mobius.daf", + @"dart" : @"application/vnd.dart", + @"dataless" : @"application/vnd.fdsn.seed", + @"davmount" : @"application/davmount+xml", + @"dbk" : @"application/docbook+xml", + @"dcr" : @"application/x-director", + @"dcurl" : @"text/vnd.curl.dcurl", + @"dd2" : @"application/vnd.oma.dd2+xml", + @"ddd" : @"application/vnd.fujixerox.ddd", + @"deb" : @"application/x-debian-package", + @"def" : @"text/plain", + @"deploy" : @"application/octet-stream", + @"der" : @"application/x-x509-ca-cert", + @"dfac" : @"application/vnd.dreamfactory", + @"dgc" : @"application/x-dgc-compressed", + @"dic" : @"text/x-c", + @"dir" : @"application/x-director", + @"dis" : @"application/vnd.mobius.dis", + @"dist" : @"application/octet-stream", + @"distz" : @"application/octet-stream", + @"djv" : @"image/vnd.djvu", + @"djvu" : @"image/vnd.djvu", + @"dll" : @"application/x-msdownload", + @"dmg" : @"application/x-apple-diskimage", + @"dmp" : @"application/vnd.tcpdump.pcap", + @"dms" : @"application/octet-stream", + @"dna" : @"application/vnd.dna", + @"doc" : @"application/msword", + @"docm" : @"application/vnd.ms-word.document.macroenabled.12", + @"docx" : @"application/vnd.openxmlformats-officedocument.wordprocessingml.document", + @"dot" : @"application/msword", + @"dotm" : @"application/vnd.ms-word.template.macroenabled.12", + @"dotx" : @"application/vnd.openxmlformats-officedocument.wordprocessingml.template", + @"dp" : @"application/vnd.osgi.dp", + @"dpg" : @"application/vnd.dpgraph", + @"dra" : @"audio/vnd.dra", + @"dsc" : @"text/prs.lines.tag", + @"dssc" : @"application/dssc+der", + @"dtb" : @"application/x-dtbook+xml", + @"dtd" : @"application/xml-dtd", + @"dts" : @"audio/vnd.dts", + @"dtshd" : @"audio/vnd.dts.hd", + @"dump" : @"application/octet-stream", + @"dvb" : @"video/vnd.dvb.file", + @"dvi" : @"application/x-dvi", + @"dwf" : @"model/vnd.dwf", + @"dwg" : @"image/vnd.dwg", + @"dxf" : @"image/vnd.dxf", + @"dxp" : @"application/vnd.spotfire.dxp", + @"dxr" : @"application/x-director", + @"ecelp4800" : @"audio/vnd.nuera.ecelp4800", + @"ecelp7470" : @"audio/vnd.nuera.ecelp7470", + @"ecelp9600" : @"audio/vnd.nuera.ecelp9600", + @"ecma" : @"application/ecmascript", + @"edm" : @"application/vnd.novadigm.edm", + @"edx" : @"application/vnd.novadigm.edx", + @"efif" : @"application/vnd.picsel", + @"ei6" : @"application/vnd.pg.osasli", + @"elc" : @"application/octet-stream", + @"emf" : @"application/x-msmetafile", + @"eml" : @"message/rfc822", + @"emma" : @"application/emma+xml", + @"emz" : @"application/x-msmetafile", + @"eol" : @"audio/vnd.digital-winds", + @"eot" : @"application/vnd.ms-fontobject", + @"eps" : @"application/postscript", + @"epub" : @"application/epub+zip", + @"es3" : @"application/vnd.eszigno3+xml", + @"esa" : @"application/vnd.osgi.subsystem", + @"esf" : @"application/vnd.epson.esf", + @"et3" : @"application/vnd.eszigno3+xml", + @"etx" : @"text/x-setext", + @"eva" : @"application/x-eva", + @"evy" : @"application/x-envoy", + @"exe" : @"application/x-msdownload", + @"exi" : @"application/exi", + @"ext" : @"application/vnd.novadigm.ext", + @"ez" : @"application/andrew-inset", + @"ez2" : @"application/vnd.ezpix-album", + @"ez3" : @"application/vnd.ezpix-package", + @"f" : @"text/x-fortran", + @"f4v" : @"video/x-f4v", + @"f77" : @"text/x-fortran", + @"f90" : @"text/x-fortran", + @"fbs" : @"image/vnd.fastbidsheet", + @"fcdt" : @"application/vnd.adobe.formscentral.fcdt", + @"fcs" : @"application/vnd.isac.fcs", + @"fdf" : @"application/vnd.fdf", + @"fe_launch" : @"application/vnd.denovo.fcselayout-link", + @"fg5" : @"application/vnd.fujitsu.oasysgp", + @"fgd" : @"application/x-director", + @"fh" : @"image/x-freehand", + @"fh4" : @"image/x-freehand", + @"fh5" : @"image/x-freehand", + @"fh7" : @"image/x-freehand", + @"fhc" : @"image/x-freehand", + @"fig" : @"application/x-xfig", + @"flac" : @"audio/x-flac", + @"fli" : @"video/x-fli", + @"flo" : @"application/vnd.micrografx.flo", + @"flv" : @"video/x-flv", + @"flw" : @"application/vnd.kde.kivio", + @"flx" : @"text/vnd.fmi.flexstor", + @"fly" : @"text/vnd.fly", + @"fm" : @"application/vnd.framemaker", + @"fnc" : @"application/vnd.frogans.fnc", + @"for" : @"text/x-fortran", + @"fpx" : @"image/vnd.fpx", + @"frame" : @"application/vnd.framemaker", + @"fsc" : @"application/vnd.fsc.weblaunch", + @"fst" : @"image/vnd.fst", + @"ftc" : @"application/vnd.fluxtime.clip", + @"fti" : @"application/vnd.anser-web-funds-transfer-initiation", + @"fvt" : @"video/vnd.fvt", + @"fxp" : @"application/vnd.adobe.fxp", + @"fxpl" : @"application/vnd.adobe.fxp", + @"fzs" : @"application/vnd.fuzzysheet", + @"g2w" : @"application/vnd.geoplan", + @"g3" : @"image/g3fax", + @"g3w" : @"application/vnd.geospace", + @"gac" : @"application/vnd.groove-account", + @"gam" : @"application/x-tads", + @"gbr" : @"application/rpki-ghostbusters", + @"gca" : @"application/x-gca-compressed", + @"gdl" : @"model/vnd.gdl", + @"geo" : @"application/vnd.dynageo", + @"gex" : @"application/vnd.geometry-explorer", + @"ggb" : @"application/vnd.geogebra.file", + @"ggt" : @"application/vnd.geogebra.tool", + @"ghf" : @"application/vnd.groove-help", + @"gif" : @"image/gif", + @"gim" : @"application/vnd.groove-identity-message", + @"gml" : @"application/gml+xml", + @"gmx" : @"application/vnd.gmx", + @"gnumeric" : @"application/x-gnumeric", + @"gph" : @"application/vnd.flographit", + @"gpx" : @"application/gpx+xml", + @"gqf" : @"application/vnd.grafeq", + @"gqs" : @"application/vnd.grafeq", + @"gram" : @"application/srgs", + @"gramps" : @"application/x-gramps-xml", + @"gre" : @"application/vnd.geometry-explorer", + @"grv" : @"application/vnd.groove-injector", + @"grxml" : @"application/srgs+xml", + @"gsf" : @"application/x-font-ghostscript", + @"gtar" : @"application/x-gtar", + @"gtm" : @"application/vnd.groove-tool-message", + @"gtw" : @"model/vnd.gtw", + @"gv" : @"text/vnd.graphviz", + @"gxf" : @"application/gxf", + @"gxt" : @"application/vnd.geonext", + @"h" : @"text/x-c", + @"h261" : @"video/h261", + @"h263" : @"video/h263", + @"h264" : @"video/h264", + @"hal" : @"application/vnd.hal+xml", + @"hbci" : @"application/vnd.hbci", + @"hdf" : @"application/x-hdf", + @"hh" : @"text/x-c", + @"hlp" : @"application/winhlp", + @"hpgl" : @"application/vnd.hp-hpgl", + @"hpid" : @"application/vnd.hp-hpid", + @"hps" : @"application/vnd.hp-hps", + @"hqx" : @"application/mac-binhex40", + @"htke" : @"application/vnd.kenameaapp", + @"htm" : @"text/html", + @"html" : @"text/html", + @"hvd" : @"application/vnd.yamaha.hv-dic", + @"hvp" : @"application/vnd.yamaha.hv-voice", + @"hvs" : @"application/vnd.yamaha.hv-script", + @"i2g" : @"application/vnd.intergeo", + @"icc" : @"application/vnd.iccprofile", + @"ice" : @"x-conference/x-cooltalk", + @"icm" : @"application/vnd.iccprofile", + @"ico" : @"image/x-icon", + @"ics" : @"text/calendar", + @"ief" : @"image/ief", + @"ifb" : @"text/calendar", + @"ifm" : @"application/vnd.shana.informed.formdata", + @"iges" : @"model/iges", + @"igl" : @"application/vnd.igloader", + @"igm" : @"application/vnd.insors.igm", + @"igs" : @"model/iges", + @"igx" : @"application/vnd.micrografx.igx", + @"iif" : @"application/vnd.shana.informed.interchange", + @"imp" : @"application/vnd.accpac.simply.imp", + @"ims" : @"application/vnd.ms-ims", + @"in" : @"text/plain", + @"ink" : @"application/inkml+xml", + @"inkml" : @"application/inkml+xml", + @"install" : @"application/x-install-instructions", + @"iota" : @"application/vnd.astraea-software.iota", + @"ipfix" : @"application/ipfix", + @"ipk" : @"application/vnd.shana.informed.package", + @"irm" : @"application/vnd.ibm.rights-management", + @"irp" : @"application/vnd.irepository.package+xml", + @"iso" : @"application/x-iso9660-image", + @"itp" : @"application/vnd.shana.informed.formtemplate", + @"ivp" : @"application/vnd.immervision-ivp", + @"ivu" : @"application/vnd.immervision-ivu", + @"jad" : @"text/vnd.sun.j2me.app-descriptor", + @"jam" : @"application/vnd.jam", + @"jar" : @"application/java-archive", + @"java" : @"text/x-java-source", + @"jisp" : @"application/vnd.jisp", + @"jlt" : @"application/vnd.hp-jlyt", + @"jnlp" : @"application/x-java-jnlp-file", + @"joda" : @"application/vnd.joost.joda-archive", + @"jpe" : @"image/jpeg", + @"jpeg" : @"image/jpeg", + @"jpg" : @"image/jpeg", + @"jpgm" : @"video/jpm", + @"jpgv" : @"video/jpeg", + @"jpm" : @"video/jpm", + @"js" : @"application/javascript", + @"json" : @"application/json", + @"jsonml" : @"application/jsonml+json", + @"kar" : @"audio/midi", + @"karbon" : @"application/vnd.kde.karbon", + @"kfo" : @"application/vnd.kde.kformula", + @"kia" : @"application/vnd.kidspiration", + @"kml" : @"application/vnd.google-earth.kml+xml", + @"kmz" : @"application/vnd.google-earth.kmz", + @"kne" : @"application/vnd.kinar", + @"knp" : @"application/vnd.kinar", + @"kon" : @"application/vnd.kde.kontour", + @"kpr" : @"application/vnd.kde.kpresenter", + @"kpt" : @"application/vnd.kde.kpresenter", + @"kpxx" : @"application/vnd.ds-keypoint", + @"ksp" : @"application/vnd.kde.kspread", + @"ktr" : @"application/vnd.kahootz", + @"ktx" : @"image/ktx", + @"ktz" : @"application/vnd.kahootz", + @"kwd" : @"application/vnd.kde.kword", + @"kwt" : @"application/vnd.kde.kword", + @"lasxml" : @"application/vnd.las.las+xml", + @"latex" : @"application/x-latex", + @"lbd" : @"application/vnd.llamagraphics.life-balance.desktop", + @"lbe" : @"application/vnd.llamagraphics.life-balance.exchange+xml", + @"les" : @"application/vnd.hhe.lesson-player", + @"lha" : @"application/x-lzh-compressed", + @"link66" : @"application/vnd.route66.link66+xml", + @"list" : @"text/plain", + @"list3820" : @"application/vnd.ibm.modcap", + @"listafp" : @"application/vnd.ibm.modcap", + @"lnk" : @"application/x-ms-shortcut", + @"log" : @"text/plain", + @"lostxml" : @"application/lost+xml", + @"lrf" : @"application/octet-stream", + @"lrm" : @"application/vnd.ms-lrm", + @"ltf" : @"application/vnd.frogans.ltf", + @"lvp" : @"audio/vnd.lucent.voice", + @"lwp" : @"application/vnd.lotus-wordpro", + @"lzh" : @"application/x-lzh-compressed", + @"m13" : @"application/x-msmediaview", + @"m14" : @"application/x-msmediaview", + @"m1v" : @"video/mpeg", + @"m21" : @"application/mp21", + @"m2a" : @"audio/mpeg", + @"m2v" : @"video/mpeg", + @"m3a" : @"audio/mpeg", + @"m3u" : @"audio/x-mpegurl", + @"m3u8" : @"application/vnd.apple.mpegurl", + @"m4a" : @"audio/mp4", + @"m4u" : @"video/vnd.mpegurl", + @"m4v" : @"video/x-m4v", + @"ma" : @"application/mathematica", + @"mads" : @"application/mads+xml", + @"mag" : @"application/vnd.ecowin.chart", + @"maker" : @"application/vnd.framemaker", + @"man" : @"text/troff", + @"mar" : @"application/octet-stream", + @"mathml" : @"application/mathml+xml", + @"mb" : @"application/mathematica", + @"mbk" : @"application/vnd.mobius.mbk", + @"mbox" : @"application/mbox", + @"mc1" : @"application/vnd.medcalcdata", + @"mcd" : @"application/vnd.mcd", + @"mcurl" : @"text/vnd.curl.mcurl", + @"mdb" : @"application/x-msaccess", + @"mdi" : @"image/vnd.ms-modi", + @"me" : @"text/troff", + @"mesh" : @"model/mesh", + @"meta4" : @"application/metalink4+xml", + @"metalink" : @"application/metalink+xml", + @"mets" : @"application/mets+xml", + @"mfm" : @"application/vnd.mfmp", + @"mft" : @"application/rpki-manifest", + @"mgp" : @"application/vnd.osgeo.mapguide.package", + @"mgz" : @"application/vnd.proteus.magazine", + @"mid" : @"audio/midi", + @"midi" : @"audio/midi", + @"mie" : @"application/x-mie", + @"mif" : @"application/vnd.mif", + @"mime" : @"message/rfc822", + @"mj2" : @"video/mj2", + @"mjp2" : @"video/mj2", + @"mk3d" : @"video/x-matroska", + @"mka" : @"audio/x-matroska", + @"mks" : @"video/x-matroska", + @"mkv" : @"video/x-matroska", + @"mlp" : @"application/vnd.dolby.mlp", + @"mmd" : @"application/vnd.chipnuts.karaoke-mmd", + @"mmf" : @"application/vnd.smaf", + @"mmr" : @"image/vnd.fujixerox.edmics-mmr", + @"mng" : @"video/x-mng", + @"mny" : @"application/x-msmoney", + @"mobi" : @"application/x-mobipocket-ebook", + @"mods" : @"application/mods+xml", + @"mov" : @"video/quicktime", + @"movie" : @"video/x-sgi-movie", + @"mp2" : @"audio/mpeg", + @"mp21" : @"application/mp21", + @"mp2a" : @"audio/mpeg", + @"mp3" : @"audio/mpeg", + @"mp4" : @"video/mp4", + @"mp4a" : @"audio/mp4", + @"mp4s" : @"application/mp4", + @"mp4v" : @"video/mp4", + @"mpc" : @"application/vnd.mophun.certificate", + @"mpe" : @"video/mpeg", + @"mpeg" : @"video/mpeg", + @"mpg" : @"video/mpeg", + @"mpg4" : @"video/mp4", + @"mpga" : @"audio/mpeg", + @"mpkg" : @"application/vnd.apple.installer+xml", + @"mpm" : @"application/vnd.blueice.multipass", + @"mpn" : @"application/vnd.mophun.application", + @"mpp" : @"application/vnd.ms-project", + @"mpt" : @"application/vnd.ms-project", + @"mpy" : @"application/vnd.ibm.minipay", + @"mqy" : @"application/vnd.mobius.mqy", + @"mrc" : @"application/marc", + @"mrcx" : @"application/marcxml+xml", + @"ms" : @"text/troff", + @"mscml" : @"application/mediaservercontrol+xml", + @"mseed" : @"application/vnd.fdsn.mseed", + @"mseq" : @"application/vnd.mseq", + @"msf" : @"application/vnd.epson.msf", + @"msh" : @"model/mesh", + @"msi" : @"application/x-msdownload", + @"msl" : @"application/vnd.mobius.msl", + @"msty" : @"application/vnd.muvee.style", + @"mts" : @"model/vnd.mts", + @"mus" : @"application/vnd.musician", + @"musicxml" : @"application/vnd.recordare.musicxml+xml", + @"mvb" : @"application/x-msmediaview", + @"mwf" : @"application/vnd.mfer", + @"mxf" : @"application/mxf", + @"mxl" : @"application/vnd.recordare.musicxml", + @"mxml" : @"application/xv+xml", + @"mxs" : @"application/vnd.triscape.mxs", + @"mxu" : @"video/vnd.mpegurl", + @"n-gage" : @"application/vnd.nokia.n-gage.symbian.install", + @"n3" : @"text/n3", + @"nb" : @"application/mathematica", + @"nbp" : @"application/vnd.wolfram.player", + @"nc" : @"application/x-netcdf", + @"ncx" : @"application/x-dtbncx+xml", + @"nfo" : @"text/x-nfo", + @"ngdat" : @"application/vnd.nokia.n-gage.data", + @"nitf" : @"application/vnd.nitf", + @"nlu" : @"application/vnd.neurolanguage.nlu", + @"nml" : @"application/vnd.enliven", + @"nnd" : @"application/vnd.noblenet-directory", + @"nns" : @"application/vnd.noblenet-sealer", + @"nnw" : @"application/vnd.noblenet-web", + @"npx" : @"image/vnd.net-fpx", + @"nsc" : @"application/x-conference", + @"nsf" : @"application/vnd.lotus-notes", + @"ntf" : @"application/vnd.nitf", + @"nzb" : @"application/x-nzb", + @"oa2" : @"application/vnd.fujitsu.oasys2", + @"oa3" : @"application/vnd.fujitsu.oasys3", + @"oas" : @"application/vnd.fujitsu.oasys", + @"obd" : @"application/x-msbinder", + @"obj" : @"application/x-tgif", + @"oda" : @"application/oda", + @"odb" : @"application/vnd.oasis.opendocument.database", + @"odc" : @"application/vnd.oasis.opendocument.chart", + @"odf" : @"application/vnd.oasis.opendocument.formula", + @"odft" : @"application/vnd.oasis.opendocument.formula-template", + @"odg" : @"application/vnd.oasis.opendocument.graphics", + @"odi" : @"application/vnd.oasis.opendocument.image", + @"odm" : @"application/vnd.oasis.opendocument.text-master", + @"odp" : @"application/vnd.oasis.opendocument.presentation", + @"ods" : @"application/vnd.oasis.opendocument.spreadsheet", + @"odt" : @"application/vnd.oasis.opendocument.text", + @"oga" : @"audio/ogg", + @"ogg" : @"audio/ogg", + @"ogv" : @"video/ogg", + @"ogx" : @"application/ogg", + @"omdoc" : @"application/omdoc+xml", + @"onepkg" : @"application/onenote", + @"onetmp" : @"application/onenote", + @"onetoc" : @"application/onenote", + @"onetoc2" : @"application/onenote", + @"opf" : @"application/oebps-package+xml", + @"opml" : @"text/x-opml", + @"oprc" : @"application/vnd.palm", + @"org" : @"application/vnd.lotus-organizer", + @"osf" : @"application/vnd.yamaha.openscoreformat", + @"osfpvg" : @"application/vnd.yamaha.openscoreformat.osfpvg+xml", + @"otc" : @"application/vnd.oasis.opendocument.chart-template", + @"otf" : @"application/x-font-otf", + @"otg" : @"application/vnd.oasis.opendocument.graphics-template", + @"oth" : @"application/vnd.oasis.opendocument.text-web", + @"oti" : @"application/vnd.oasis.opendocument.image-template", + @"otp" : @"application/vnd.oasis.opendocument.presentation-template", + @"ots" : @"application/vnd.oasis.opendocument.spreadsheet-template", + @"ott" : @"application/vnd.oasis.opendocument.text-template", + @"oxps" : @"application/oxps", + @"oxt" : @"application/vnd.openofficeorg.extension", + @"p" : @"text/x-pascal", + @"p10" : @"application/pkcs10", + @"p12" : @"application/x-pkcs12", + @"p7b" : @"application/x-pkcs7-certificates", + @"p7c" : @"application/pkcs7-mime", + @"p7m" : @"application/pkcs7-mime", + @"p7r" : @"application/x-pkcs7-certreqresp", + @"p7s" : @"application/pkcs7-signature", + @"p8" : @"application/pkcs8", + @"pas" : @"text/x-pascal", + @"paw" : @"application/vnd.pawaafile", + @"pbd" : @"application/vnd.powerbuilder6", + @"pbm" : @"image/x-portable-bitmap", + @"pcap" : @"application/vnd.tcpdump.pcap", + @"pcf" : @"application/x-font-pcf", + @"pcl" : @"application/vnd.hp-pcl", + @"pclxl" : @"application/vnd.hp-pclxl", + @"pct" : @"image/x-pict", + @"pcurl" : @"application/vnd.curl.pcurl", + @"pcx" : @"image/x-pcx", + @"pdb" : @"application/vnd.palm", + @"pdf" : @"application/pdf", + @"pfa" : @"application/x-font-type1", + @"pfb" : @"application/x-font-type1", + @"pfm" : @"application/x-font-type1", + @"pfr" : @"application/font-tdpfr", + @"pfx" : @"application/x-pkcs12", + @"pgm" : @"image/x-portable-graymap", + @"pgn" : @"application/x-chess-pgn", + @"pgp" : @"application/pgp-encrypted", + @"pic" : @"image/x-pict", + @"pkg" : @"application/octet-stream", + @"pki" : @"application/pkixcmp", + @"pkipath" : @"application/pkix-pkipath", + @"plb" : @"application/vnd.3gpp.pic-bw-large", + @"plc" : @"application/vnd.mobius.plc", + @"plf" : @"application/vnd.pocketlearn", + @"pls" : @"application/pls+xml", + @"pml" : @"application/vnd.ctc-posml", + @"png" : @"image/png", + @"pnm" : @"image/x-portable-anymap", + @"portpkg" : @"application/vnd.macports.portpkg", + @"pot" : @"application/vnd.ms-powerpoint", + @"potm" : @"application/vnd.ms-powerpoint.template.macroenabled.12", + @"potx" : @"application/vnd.openxmlformats-officedocument.presentationml.template", + @"ppam" : @"application/vnd.ms-powerpoint.addin.macroenabled.12", + @"ppd" : @"application/vnd.cups-ppd", + @"ppm" : @"image/x-portable-pixmap", + @"pps" : @"application/vnd.ms-powerpoint", + @"ppsm" : @"application/vnd.ms-powerpoint.slideshow.macroenabled.12", + @"ppsx" : @"application/vnd.openxmlformats-officedocument.presentationml.slideshow", + @"ppt" : @"application/vnd.ms-powerpoint", + @"pptm" : @"application/vnd.ms-powerpoint.presentation.macroenabled.12", + @"pptx" : @"application/vnd.openxmlformats-officedocument.presentationml.presentation", + @"pqa" : @"application/vnd.palm", + @"prc" : @"application/x-mobipocket-ebook", + @"pre" : @"application/vnd.lotus-freelance", + @"prf" : @"application/pics-rules", + @"ps" : @"application/postscript", + @"psb" : @"application/vnd.3gpp.pic-bw-small", + @"psd" : @"image/vnd.adobe.photoshop", + @"psf" : @"application/x-font-linux-psf", + @"pskcxml" : @"application/pskc+xml", + @"ptid" : @"application/vnd.pvi.ptid1", + @"pub" : @"application/x-mspublisher", + @"pvb" : @"application/vnd.3gpp.pic-bw-var", + @"pwn" : @"application/vnd.3m.post-it-notes", + @"pya" : @"audio/vnd.ms-playready.media.pya", + @"pyv" : @"video/vnd.ms-playready.media.pyv", + @"qam" : @"application/vnd.epson.quickanime", + @"qbo" : @"application/vnd.intu.qbo", + @"qfx" : @"application/vnd.intu.qfx", + @"qps" : @"application/vnd.publishare-delta-tree", + @"qt" : @"video/quicktime", + @"qwd" : @"application/vnd.quark.quarkxpress", + @"qwt" : @"application/vnd.quark.quarkxpress", + @"qxb" : @"application/vnd.quark.quarkxpress", + @"qxd" : @"application/vnd.quark.quarkxpress", + @"qxl" : @"application/vnd.quark.quarkxpress", + @"qxt" : @"application/vnd.quark.quarkxpress", + @"ra" : @"audio/x-pn-realaudio", + @"ram" : @"audio/x-pn-realaudio", + @"rar" : @"application/x-rar-compressed", + @"ras" : @"image/x-cmu-raster", + @"rcprofile" : @"application/vnd.ipunplugged.rcprofile", + @"rdf" : @"application/rdf+xml", + @"rdz" : @"application/vnd.data-vision.rdz", + @"rep" : @"application/vnd.businessobjects", + @"res" : @"application/x-dtbresource+xml", + @"rgb" : @"image/x-rgb", + @"rif" : @"application/reginfo+xml", + @"rip" : @"audio/vnd.rip", + @"ris" : @"application/x-research-info-systems", + @"rl" : @"application/resource-lists+xml", + @"rlc" : @"image/vnd.fujixerox.edmics-rlc", + @"rld" : @"application/resource-lists-diff+xml", + @"rm" : @"application/vnd.rn-realmedia", + @"rmi" : @"audio/midi", + @"rmp" : @"audio/x-pn-realaudio-plugin", + @"rms" : @"application/vnd.jcp.javame.midlet-rms", + @"rmvb" : @"application/vnd.rn-realmedia-vbr", + @"rnc" : @"application/relax-ng-compact-syntax", + @"roa" : @"application/rpki-roa", + @"roff" : @"text/troff", + @"rp9" : @"application/vnd.cloanto.rp9", + @"rpss" : @"application/vnd.nokia.radio-presets", + @"rpst" : @"application/vnd.nokia.radio-preset", + @"rq" : @"application/sparql-query", + @"rs" : @"application/rls-services+xml", + @"rsd" : @"application/rsd+xml", + @"rss" : @"application/rss+xml", + @"rtf" : @"application/rtf", + @"rtx" : @"text/richtext", + @"s" : @"text/x-asm", + @"s3m" : @"audio/s3m", + @"saf" : @"application/vnd.yamaha.smaf-audio", + @"sbml" : @"application/sbml+xml", + @"sc" : @"application/vnd.ibm.secure-container", + @"scd" : @"application/x-msschedule", + @"scm" : @"application/vnd.lotus-screencam", + @"scq" : @"application/scvp-cv-request", + @"scs" : @"application/scvp-cv-response", + @"scurl" : @"text/vnd.curl.scurl", + @"sda" : @"application/vnd.stardivision.draw", + @"sdc" : @"application/vnd.stardivision.calc", + @"sdd" : @"application/vnd.stardivision.impress", + @"sdkd" : @"application/vnd.solent.sdkm+xml", + @"sdkm" : @"application/vnd.solent.sdkm+xml", + @"sdp" : @"application/sdp", + @"sdw" : @"application/vnd.stardivision.writer", + @"see" : @"application/vnd.seemail", + @"seed" : @"application/vnd.fdsn.seed", + @"sema" : @"application/vnd.sema", + @"semd" : @"application/vnd.semd", + @"semf" : @"application/vnd.semf", + @"ser" : @"application/java-serialized-object", + @"setpay" : @"application/set-payment-initiation", + @"setreg" : @"application/set-registration-initiation", + @"sfd-hdstx" : @"application/vnd.hydrostatix.sof-data", + @"sfs" : @"application/vnd.spotfire.sfs", + @"sfv" : @"text/x-sfv", + @"sgi" : @"image/sgi", + @"sgl" : @"application/vnd.stardivision.writer-global", + @"sgm" : @"text/sgml", + @"sgml" : @"text/sgml", + @"sh" : @"application/x-sh", + @"shar" : @"application/x-shar", + @"shf" : @"application/shf+xml", + @"sid" : @"image/x-mrsid-image", + @"sig" : @"application/pgp-signature", + @"sil" : @"audio/silk", + @"silo" : @"model/mesh", + @"sis" : @"application/vnd.symbian.install", + @"sisx" : @"application/vnd.symbian.install", + @"sit" : @"application/x-stuffit", + @"sitx" : @"application/x-stuffitx", + @"skd" : @"application/vnd.koan", + @"skm" : @"application/vnd.koan", + @"skp" : @"application/vnd.koan", + @"skt" : @"application/vnd.koan", + @"sldm" : @"application/vnd.ms-powerpoint.slide.macroenabled.12", + @"sldx" : @"application/vnd.openxmlformats-officedocument.presentationml.slide", + @"slt" : @"application/vnd.epson.salt", + @"sm" : @"application/vnd.stepmania.stepchart", + @"smf" : @"application/vnd.stardivision.math", + @"smi" : @"application/smil+xml", + @"smil" : @"application/smil+xml", + @"smv" : @"video/x-smv", + @"smzip" : @"application/vnd.stepmania.package", + @"snd" : @"audio/basic", + @"snf" : @"application/x-font-snf", + @"so" : @"application/octet-stream", + @"spc" : @"application/x-pkcs7-certificates", + @"spf" : @"application/vnd.yamaha.smaf-phrase", + @"spl" : @"application/x-futuresplash", + @"spot" : @"text/vnd.in3d.spot", + @"spp" : @"application/scvp-vp-response", + @"spq" : @"application/scvp-vp-request", + @"spx" : @"audio/ogg", + @"sql" : @"application/x-sql", + @"src" : @"application/x-wais-source", + @"srt" : @"application/x-subrip", + @"sru" : @"application/sru+xml", + @"srx" : @"application/sparql-results+xml", + @"ssdl" : @"application/ssdl+xml", + @"sse" : @"application/vnd.kodak-descriptor", + @"ssf" : @"application/vnd.epson.ssf", + @"ssml" : @"application/ssml+xml", + @"st" : @"application/vnd.sailingtracker.track", + @"stc" : @"application/vnd.sun.xml.calc.template", + @"std" : @"application/vnd.sun.xml.draw.template", + @"stf" : @"application/vnd.wt.stf", + @"sti" : @"application/vnd.sun.xml.impress.template", + @"stk" : @"application/hyperstudio", + @"stl" : @"application/vnd.ms-pki.stl", + @"str" : @"application/vnd.pg.format", + @"stw" : @"application/vnd.sun.xml.writer.template", + @"sub" : @"text/vnd.dvb.subtitle", + @"sus" : @"application/vnd.sus-calendar", + @"susp" : @"application/vnd.sus-calendar", + @"sv4cpio" : @"application/x-sv4cpio", + @"sv4crc" : @"application/x-sv4crc", + @"svc" : @"application/vnd.dvb.service", + @"svd" : @"application/vnd.svd", + @"svg" : @"image/svg+xml", + @"svgz" : @"image/svg+xml", + @"swa" : @"application/x-director", + @"swf" : @"application/x-shockwave-flash", + @"swi" : @"application/vnd.aristanetworks.swi", + @"sxc" : @"application/vnd.sun.xml.calc", + @"sxd" : @"application/vnd.sun.xml.draw", + @"sxg" : @"application/vnd.sun.xml.writer.global", + @"sxi" : @"application/vnd.sun.xml.impress", + @"sxm" : @"application/vnd.sun.xml.math", + @"sxw" : @"application/vnd.sun.xml.writer", + @"t" : @"text/troff", + @"t3" : @"application/x-t3vm-image", + @"taglet" : @"application/vnd.mynfc", + @"tao" : @"application/vnd.tao.intent-module-archive", + @"tar" : @"application/x-tar", + @"tcap" : @"application/vnd.3gpp2.tcap", + @"tcl" : @"application/x-tcl", + @"teacher" : @"application/vnd.smart.teacher", + @"tei" : @"application/tei+xml", + @"teicorpus" : @"application/tei+xml", + @"tex" : @"application/x-tex", + @"texi" : @"application/x-texinfo", + @"texinfo" : @"application/x-texinfo", + @"text" : @"text/plain", + @"tfi" : @"application/thraud+xml", + @"tfm" : @"application/x-tex-tfm", + @"tga" : @"image/x-tga", + @"thmx" : @"application/vnd.ms-officetheme", + @"tif" : @"image/tiff", + @"tiff" : @"image/tiff", + @"tmo" : @"application/vnd.tmobile-livetv", + @"torrent" : @"application/x-bittorrent", + @"tpl" : @"application/vnd.groove-tool-template", + @"tpt" : @"application/vnd.trid.tpt", + @"tr" : @"text/troff", + @"tra" : @"application/vnd.trueapp", + @"trm" : @"application/x-msterminal", + @"tsd" : @"application/timestamped-data", + @"tsv" : @"text/tab-separated-values", + @"ttc" : @"application/x-font-ttf", + @"ttf" : @"application/x-font-ttf", + @"ttl" : @"text/turtle", + @"twd" : @"application/vnd.simtech-mindmapper", + @"twds" : @"application/vnd.simtech-mindmapper", + @"txd" : @"application/vnd.genomatix.tuxedo", + @"txf" : @"application/vnd.mobius.txf", + @"txt" : @"text/plain", + @"u32" : @"application/x-authorware-bin", + @"udeb" : @"application/x-debian-package", + @"ufd" : @"application/vnd.ufdl", + @"ufdl" : @"application/vnd.ufdl", + @"ulx" : @"application/x-glulx", + @"umj" : @"application/vnd.umajin", + @"unityweb" : @"application/vnd.unity", + @"uoml" : @"application/vnd.uoml+xml", + @"uri" : @"text/uri-list", + @"uris" : @"text/uri-list", + @"urls" : @"text/uri-list", + @"ustar" : @"application/x-ustar", + @"utz" : @"application/vnd.uiq.theme", + @"uu" : @"text/x-uuencode", + @"uva" : @"audio/vnd.dece.audio", + @"uvd" : @"application/vnd.dece.data", + @"uvf" : @"application/vnd.dece.data", + @"uvg" : @"image/vnd.dece.graphic", + @"uvh" : @"video/vnd.dece.hd", + @"uvi" : @"image/vnd.dece.graphic", + @"uvm" : @"video/vnd.dece.mobile", + @"uvp" : @"video/vnd.dece.pd", + @"uvs" : @"video/vnd.dece.sd", + @"uvt" : @"application/vnd.dece.ttml+xml", + @"uvu" : @"video/vnd.uvvu.mp4", + @"uvv" : @"video/vnd.dece.video", + @"uvva" : @"audio/vnd.dece.audio", + @"uvvd" : @"application/vnd.dece.data", + @"uvvf" : @"application/vnd.dece.data", + @"uvvg" : @"image/vnd.dece.graphic", + @"uvvh" : @"video/vnd.dece.hd", + @"uvvi" : @"image/vnd.dece.graphic", + @"uvvm" : @"video/vnd.dece.mobile", + @"uvvp" : @"video/vnd.dece.pd", + @"uvvs" : @"video/vnd.dece.sd", + @"uvvt" : @"application/vnd.dece.ttml+xml", + @"uvvu" : @"video/vnd.uvvu.mp4", + @"uvvv" : @"video/vnd.dece.video", + @"uvvx" : @"application/vnd.dece.unspecified", + @"uvvz" : @"application/vnd.dece.zip", + @"uvx" : @"application/vnd.dece.unspecified", + @"uvz" : @"application/vnd.dece.zip", + @"vcard" : @"text/vcard", + @"vcd" : @"application/x-cdlink", + @"vcf" : @"text/x-vcard", + @"vcg" : @"application/vnd.groove-vcard", + @"vcs" : @"text/x-vcalendar", + @"vcx" : @"application/vnd.vcx", + @"vis" : @"application/vnd.visionary", + @"viv" : @"video/vnd.vivo", + @"vob" : @"video/x-ms-vob", + @"vor" : @"application/vnd.stardivision.writer", + @"vox" : @"application/x-authorware-bin", + @"vrml" : @"model/vrml", + @"vsd" : @"application/vnd.visio", + @"vsf" : @"application/vnd.vsf", + @"vss" : @"application/vnd.visio", + @"vst" : @"application/vnd.visio", + @"vsw" : @"application/vnd.visio", + @"vtu" : @"model/vnd.vtu", + @"vxml" : @"application/voicexml+xml", + @"w3d" : @"application/x-director", + @"wad" : @"application/x-doom", + @"wav" : @"audio/x-wav", + @"wax" : @"audio/x-ms-wax", + @"wbmp" : @"image/vnd.wap.wbmp", + @"wbs" : @"application/vnd.criticaltools.wbs+xml", + @"wbxml" : @"application/vnd.wap.wbxml", + @"wcm" : @"application/vnd.ms-works", + @"wdb" : @"application/vnd.ms-works", + @"wdp" : @"image/vnd.ms-photo", + @"weba" : @"audio/webm", + @"webm" : @"video/webm", + @"webp" : @"image/webp", + @"wg" : @"application/vnd.pmi.widget", + @"wgt" : @"application/widget", + @"wks" : @"application/vnd.ms-works", + @"wm" : @"video/x-ms-wm", + @"wma" : @"audio/x-ms-wma", + @"wmd" : @"application/x-ms-wmd", + @"wmf" : @"application/x-msmetafile", + @"wml" : @"text/vnd.wap.wml", + @"wmlc" : @"application/vnd.wap.wmlc", + @"wmls" : @"text/vnd.wap.wmlscript", + @"wmlsc" : @"application/vnd.wap.wmlscriptc", + @"wmv" : @"video/x-ms-wmv", + @"wmx" : @"video/x-ms-wmx", + @"wmz" : @"application/x-msmetafile", + @"woff" : @"application/font-woff", + @"wpd" : @"application/vnd.wordperfect", + @"wpl" : @"application/vnd.ms-wpl", + @"wps" : @"application/vnd.ms-works", + @"wqd" : @"application/vnd.wqd", + @"wri" : @"application/x-mswrite", + @"wrl" : @"model/vrml", + @"wsdl" : @"application/wsdl+xml", + @"wspolicy" : @"application/wspolicy+xml", + @"wtb" : @"application/vnd.webturbo", + @"wvx" : @"video/x-ms-wvx", + @"x32" : @"application/x-authorware-bin", + @"x3d" : @"model/x3d+xml", + @"x3db" : @"model/x3d+binary", + @"x3dbz" : @"model/x3d+binary", + @"x3dv" : @"model/x3d+vrml", + @"x3dvz" : @"model/x3d+vrml", + @"x3dz" : @"model/x3d+xml", + @"xaml" : @"application/xaml+xml", + @"xap" : @"application/x-silverlight-app", + @"xar" : @"application/vnd.xara", + @"xbap" : @"application/x-ms-xbap", + @"xbd" : @"application/vnd.fujixerox.docuworks.binder", + @"xbm" : @"image/x-xbitmap", + @"xdf" : @"application/xcap-diff+xml", + @"xdm" : @"application/vnd.syncml.dm+xml", + @"xdp" : @"application/vnd.adobe.xdp+xml", + @"xdssc" : @"application/dssc+xml", + @"xdw" : @"application/vnd.fujixerox.docuworks", + @"xenc" : @"application/xenc+xml", + @"xer" : @"application/patch-ops-error+xml", + @"xfdf" : @"application/vnd.adobe.xfdf", + @"xfdl" : @"application/vnd.xfdl", + @"xht" : @"application/xhtml+xml", + @"xhtml" : @"application/xhtml+xml", + @"xhvml" : @"application/xv+xml", + @"xif" : @"image/vnd.xiff", + @"xla" : @"application/vnd.ms-excel", + @"xlam" : @"application/vnd.ms-excel.addin.macroenabled.12", + @"xlc" : @"application/vnd.ms-excel", + @"xlf" : @"application/x-xliff+xml", + @"xlm" : @"application/vnd.ms-excel", + @"xls" : @"application/vnd.ms-excel", + @"xlsb" : @"application/vnd.ms-excel.sheet.binary.macroenabled.12", + @"xlsm" : @"application/vnd.ms-excel.sheet.macroenabled.12", + @"xlsx" : @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + @"xlt" : @"application/vnd.ms-excel", + @"xltm" : @"application/vnd.ms-excel.template.macroenabled.12", + @"xltx" : @"application/vnd.openxmlformats-officedocument.spreadsheetml.template", + @"xlw" : @"application/vnd.ms-excel", + @"xm" : @"audio/xm", + @"xml" : @"application/xml", + @"xo" : @"application/vnd.olpc-sugar", + @"xop" : @"application/xop+xml", + @"xpi" : @"application/x-xpinstall", + @"xpl" : @"application/xproc+xml", + @"xpm" : @"image/x-xpixmap", + @"xpr" : @"application/vnd.is-xpr", + @"xps" : @"application/vnd.ms-xpsdocument", + @"xpw" : @"application/vnd.intercon.formnet", + @"xpx" : @"application/vnd.intercon.formnet", + @"xsl" : @"application/xml", + @"xslt" : @"application/xslt+xml", + @"xsm" : @"application/vnd.syncml+xml", + @"xspf" : @"application/xspf+xml", + @"xul" : @"application/vnd.mozilla.xul+xml", + @"xvm" : @"application/xv+xml", + @"xvml" : @"application/xv+xml", + @"xwd" : @"image/x-xwindowdump", + @"xyz" : @"chemical/x-xyz", + @"xz" : @"application/x-xz", + @"yang" : @"application/yang", + @"yin" : @"application/yin+xml", + @"z1" : @"application/x-zmachine", + @"z2" : @"application/x-zmachine", + @"z3" : @"application/x-zmachine", + @"z4" : @"application/x-zmachine", + @"z5" : @"application/x-zmachine", + @"z6" : @"application/x-zmachine", + @"z7" : @"application/x-zmachine", + @"z8" : @"application/x-zmachine", + @"zaz" : @"application/vnd.zzazz.deck+xml", + @"zip" : @"application/zip", + @"zir" : @"application/vnd.zul", + @"zirz" : @"application/vnd.zul", + @"zmm" : @"application/vnd.handheld-entertainment+xml", + }; + }); + return result; +} + + (nullable NSString *)fileExtensionForMIMETypeViaLookup:(NSString *)mimeType { return [[self genericMIMETypesToExtensionTypes] objectForKey:mimeType]; @@ -1553,11 +2568,16 @@ NSString *const OWSMimeTypeUnknownForTests = @"unknown/mimetype"; + (nullable NSString *)fileExtensionForMIMEType:(NSString *)mimeType { - // Try to deduce the file extension by converting to a UTI type. - NSString *_Nullable fileExtension = [self fileExtensionForMIMETypeViaUTIType:mimeType]; + // Try to deduce the file extension by using a lookup table. + // + // This should be more accurate than deducing the file extension by + // converting to a UTI type. For example, .m4a files will have a + // UTI type of kUTTypeMPEG4Audio which incorrectly yields the file + // extension .mp4 instead of .m4a. + NSString *_Nullable fileExtension = [self fileExtensionForMIMETypeViaLookup:mimeType]; if (!fileExtension) { - // Try to deduce the file extension by using a lookup table.. - fileExtension = [self fileExtensionForMIMETypeViaLookup:mimeType]; + // Try to deduce the file extension by converting to a UTI type. + fileExtension = [self fileExtensionForMIMETypeViaUTIType:mimeType]; } return fileExtension; }