diff --git a/src/lib/link-meta/link-meta.ts b/src/lib/link-meta/link-meta.ts index 3d9a695f05..b2a2f9e7b2 100644 --- a/src/lib/link-meta/link-meta.ts +++ b/src/lib/link-meta/link-meta.ts @@ -1,9 +1,9 @@ -import {type BskyAgent} from '@atproto/api' +import {type AtpAgent} from '@atproto/api' import {LINK_META_PROXY} from '#/lib/constants' import {getGiphyMetaUri} from '#/lib/strings/embed-player' import {parseStarterPackUri} from '#/lib/strings/starter-pack' -import {isBskyAppUrl} from '../strings/url-helpers' +import {isBskyAppUrl} from '#/lib/strings/url-helpers' export enum LikelyType { HTML, @@ -25,7 +25,7 @@ export interface LinkMeta { } export async function getLinkMeta( - agent: BskyAgent, + agent: AtpAgent, url: string, timeout = 15e3, ): Promise { @@ -103,6 +103,9 @@ export async function getLinkMeta( return meta } +/** + * Get the likely type of content based on URL file extension. + */ export function getLikelyType(url: URL | string): LikelyType { if (typeof url === 'string') { try { @@ -113,1202 +116,1200 @@ export function getLikelyType(url: URL | string): LikelyType { } const ext = url.pathname.split('.').pop() || '' - if (ext === 'html' || ext === 'htm' || ext === 'php') { - return LikelyType.HTML - } - const mimeType = EXT_MIME_TYPES[ext] - if (!mimeType) { - return LikelyType.HTML - } - if (mimeType.startsWith('text/')) { - return LikelyType.Text - } - if (mimeType.startsWith('image/')) { - return LikelyType.Image - } - if (mimeType.startsWith('video/')) { - return LikelyType.Video - } - if (mimeType.startsWith('audio/')) { - return LikelyType.Audio - } - return LikelyType.Other -} -const EXT_MIME_TYPES: Record = { - '123': 'application/vnd.lotus-1-2-3', - '1km': 'application/vnd.1000minds.decision-model+xml', - '3dml': 'text/vnd.in3d.3dml', - '3ds': 'image/x-3ds', - '3g2': 'video/3gpp2', - '3gp': 'video/3gpp', - '3gpp': 'video/3gpp', - '3mf': 'model/3mf', - '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/vnd.nokia.n-gage.ac+xml', - 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', - age: 'application/vnd.age', - 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', - amr: 'audio/amr', - apk: 'application/vnd.android.package-archive', - apng: 'image/apng', - appcache: 'text/cache-manifest', - application: 'application/x-ms-application', - apr: 'application/vnd.lotus-approach', - arc: 'application/x-freearc', - arj: 'application/x-arj', - 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', - atomdeleted: 'application/atomdeleted+xml', - atomsvc: 'application/atomsvc+xml', - atx: 'application/vnd.antix.game-component', - au: 'audio/basic', - avi: 'video/x-msvideo', - avif: 'image/avif', - aw: 'application/applixware', - azf: 'application/vnd.airzip.filesecure.azf', - azs: 'application/vnd.airzip.filesecure.azs', - azv: 'image/vnd.airzip.accelerator.azv', - azw: 'application/vnd.amazon.ebook', - b16: 'image/vnd.pco.b16', - bat: 'application/x-msdownload', - bcpio: 'application/x-bcpio', - bdf: 'application/x-font-bdf', - bdm: 'application/vnd.syncml.dm+wbxml', - bdoc: 'application/x-bdoc', - 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', - bmml: 'application/vnd.balsamiq.bmml+xml', - bmp: 'image/x-ms-bmp', - book: 'application/vnd.framemaker', - box: 'application/vnd.previewsystems.box', - boz: 'application/x-bzip2', - bpk: 'application/octet-stream', - bsp: 'model/vnd.valve.source.compiled-map', - btif: 'image/prs.btif', - buffer: 'application/octet-stream', - 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', - cco: 'application/x-cocoa', - cct: 'application/x-director', - ccxml: 'application/ccxml+xml', - cdbcmsg: 'application/vnd.contact.cmsg', - cdf: 'application/x-netcdf', - cdfx: 'application/cdfx+xml', - 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', - cjs: 'application/node', - 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', - coffee: 'text/coffeescript', - 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', - crx: 'application/x-chrome-extension', - cryptonote: 'application/vnd.rig.cryptonote', - csh: 'application/x-csh', - csl: 'application/vnd.citationstyles.style+xml', - 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', - dbf: 'application/vnd.dbf', - dbk: 'application/docbook+xml', - dcr: 'application/x-director', - dcurl: 'text/vnd.curl.dcurl', - dd2: 'application/vnd.oma.dd2+xml', - ddd: 'application/vnd.fujixerox.ddd', - ddf: 'application/vnd.syncml.dmddf+xml', - dds: 'image/vnd.ms-dds', - 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', - 'disposition-notification': 'message/disposition-notification', - 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', - drle: 'image/dicom-rle', - 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', - dwd: 'application/atsc-dwd+xml', - dwf: 'model/vnd.dwf', - dwg: 'image/vnd.dwg', - dxf: 'image/vnd.dxf', - dxp: 'application/vnd.spotfire.dxp', - dxr: 'application/x-director', - ear: 'application/java-archive', - 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: 'image/emf', - eml: 'message/rfc822', - emma: 'application/emma+xml', - emotionml: 'application/emotionml+xml', - emz: 'application/x-msmetafile', - eol: 'audio/vnd.digital-winds', - eot: 'application/vnd.ms-fontobject', - eps: 'application/postscript', - epub: 'application/epub+zip', - es: 'application/ecmascript', - 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', - exp: 'application/express', - exr: 'image/aces', - 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', - fdt: 'application/fdt+xml', - 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', - fits: 'image/fits', - 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', - fo: 'application/vnd.software602.filler.form+xml', - 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', - gdoc: 'application/vnd.google-apps.document', - ged: 'text/vnd.familysearch.gedcom', - geo: 'application/vnd.dynageo', - geojson: 'application/geo+json', - 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', - glb: 'model/gltf-binary', - gltf: 'model/gltf+json', - 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', - gsheet: 'application/vnd.google-apps.spreadsheet', - gslides: 'application/vnd.google-apps.presentation', - 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', - gz: 'application/gzip', - h: 'text/x-c', - h261: 'video/h261', - h263: 'video/h263', - h264: 'video/h264', - hal: 'application/vnd.hal+xml', - hbci: 'application/vnd.hbci', - hbs: 'text/x-handlebars-template', - hdd: 'application/x-virtualbox-hdd', - hdf: 'application/x-hdf', - heic: 'image/heic', - heics: 'image/heic-sequence', - heif: 'image/heif', - heifs: 'image/heif-sequence', - hej2: 'image/hej2k', - held: 'application/atsc-held+xml', - hh: 'text/x-c', - hjson: 'application/hjson', - hlp: 'application/winhlp', - hpgl: 'application/vnd.hp-hpgl', - hpid: 'application/vnd.hp-hpid', - hps: 'application/vnd.hp-hps', - hqx: 'application/mac-binhex40', - hsj2: 'image/hsj2', - htc: 'text/x-component', - 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', - img: 'application/octet-stream', - imp: 'application/vnd.accpac.simply.imp', - ims: 'application/vnd.ms-ims', - in: 'text/plain', - ini: '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', - its: 'application/its+xml', - ivp: 'application/vnd.immervision-ivp', - ivu: 'application/vnd.immervision-ivu', - jad: 'text/vnd.sun.j2me.app-descriptor', - jade: 'text/jade', - jam: 'application/vnd.jam', - jar: 'application/java-archive', - jardiff: 'application/x-java-archive-diff', - java: 'text/x-java-source', - jhc: 'image/jphc', - jisp: 'application/vnd.jisp', - jls: 'image/jls', - jlt: 'application/vnd.hp-jlyt', - jng: 'image/x-jng', - jnlp: 'application/x-java-jnlp-file', - joda: 'application/vnd.joost.joda-archive', - jp2: 'image/jp2', - jpe: 'image/jpeg', - jpeg: 'image/jpeg', - jpf: 'image/jpx', - jpg: 'image/jpeg', - jpg2: 'image/jp2', - jpgm: 'video/jpm', - jpgv: 'video/jpeg', - jph: 'image/jph', - jpm: 'video/jpm', - jpx: 'image/jpx', - js: 'application/javascript', - json: 'application/json', - json5: 'application/json5', - jsonld: 'application/ld+json', - jsonml: 'application/jsonml+json', - jsx: 'text/jsx', - jxr: 'image/jxr', - jxra: 'image/jxra', - jxrs: 'image/jxrs', - jxs: 'image/jxs', - jxsc: 'image/jxsc', - jxsi: 'image/jxsi', - jxss: 'image/jxss', - kar: 'audio/midi', - karbon: 'application/vnd.kde.karbon', - kdbx: 'application/x-keepass2', - key: 'application/x-iwork-keynote-sffkey', - 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', - ktx2: 'image/ktx2', - 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', - less: 'text/less', - lgr: 'application/lgr+xml', - lha: 'application/x-lzh-compressed', - link66: 'application/vnd.route66.link66+xml', - list: 'text/plain', - list3820: 'application/vnd.ibm.modcap', - listafp: 'application/vnd.ibm.modcap', - litcoffee: 'text/coffeescript', - 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', - lua: 'text/x-lua', - luac: 'application/x-lua-bytecode', - 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/x-m4a', - m4p: 'application/mp4', - m4s: 'video/iso.segment', - m4u: 'video/vnd.mpegurl', - m4v: 'video/x-m4v', - ma: 'application/mathematica', - mads: 'application/mads+xml', - maei: 'application/mmt-aei+xml', - mag: 'application/vnd.ecowin.chart', - maker: 'application/vnd.framemaker', - man: 'text/troff', - manifest: 'text/cache-manifest', - map: 'application/json', - mar: 'application/octet-stream', - markdown: 'text/markdown', - 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', - md: 'text/markdown', - mdb: 'application/x-msaccess', - mdi: 'image/vnd.ms-modi', - mdx: 'text/mdx', - 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', - mjs: 'application/javascript', - mk3d: 'video/x-matroska', - mka: 'audio/x-matroska', - mkd: 'text/x-markdown', - mks: 'video/x-matroska', - mkv: 'video/x-matroska', - mlp: 'application/vnd.dolby.mlp', - mmd: 'application/vnd.chipnuts.karaoke-mmd', - mmf: 'application/vnd.smaf', - mml: 'text/mathml', - 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', - mpd: 'application/dash+xml', - 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', - msg: 'application/vnd.ms-outlook', - msh: 'model/mesh', - msi: 'application/x-msdownload', - msl: 'application/vnd.mobius.msl', - msm: 'application/octet-stream', - msp: 'application/octet-stream', - msty: 'application/vnd.muvee.style', - mtl: 'model/mtl', - mts: 'model/vnd.mts', - mus: 'application/vnd.musician', - musd: 'application/mmt-usd+xml', - musicxml: 'application/vnd.recordare.musicxml+xml', - mvb: 'application/x-msmediaview', - mvt: 'application/vnd.mapbox-vector-tile', - mwf: 'application/vnd.mfer', - mxf: 'application/mxf', - mxl: 'application/vnd.recordare.musicxml', - mxmf: 'audio/mobile-xmf', - 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', - nq: 'application/n-quads', - nsc: 'application/x-conference', - nsf: 'application/vnd.lotus-notes', - nt: 'application/n-triples', - ntf: 'application/vnd.nitf', - numbers: 'application/x-iwork-numbers-sffnumbers', - nzb: 'application/x-nzb', - oa2: 'application/vnd.fujitsu.oasys2', - oa3: 'application/vnd.fujitsu.oasys3', - oas: 'application/vnd.fujitsu.oasys', - obd: 'application/x-msbinder', - obgx: 'application/vnd.openblox.game+xml', - obj: 'model/obj', - 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', - ogex: 'model/vnd.opengex', - 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', - opus: 'audio/ogg', - org: 'text/x-org', - osf: 'application/vnd.yamaha.openscoreformat', - osfpvg: 'application/vnd.yamaha.openscoreformat.osfpvg+xml', - osm: 'application/vnd.openstreetmap.data+xml', - otc: 'application/vnd.oasis.opendocument.chart-template', - otf: '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', - ova: 'application/x-virtualbox-ova', - ovf: 'application/x-virtualbox-ovf', - owl: 'application/rdf+xml', - 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', - pac: 'application/x-ns-proxy-autoconfig', - pages: 'application/x-iwork-pages-sffpages', - 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/x-pilot', - pde: 'text/x-processing', - pdf: 'application/pdf', - pem: 'application/x-x509-ca-cert', - 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', - php: 'application/x-httpd-php', - pic: 'image/x-pict', - pkg: 'application/octet-stream', - pki: 'application/pkixcmp', - pkipath: 'application/pkix-pkipath', - pkpass: 'application/vnd.apple.pkpass', - pl: 'application/x-perl', - plb: 'application/vnd.3gpp.pic-bw-large', - plc: 'application/vnd.mobius.plc', - plf: 'application/vnd.pocketlearn', - pls: 'application/pls+xml', - pm: 'application/x-perl', - 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-pilot', - pre: 'application/vnd.lotus-freelance', - prf: 'application/pics-rules', - provx: 'application/provenance+xml', - 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', - pti: 'image/prs.pti', - 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-realaudio', - ram: 'audio/x-pn-realaudio', - raml: 'application/raml+yaml', - rapd: 'application/route-apd+xml', - 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', - relo: 'application/p2p-overlay+xml', - 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', - rng: 'application/xml', - roa: 'application/rpki-roa', - roff: 'text/troff', - rp9: 'application/vnd.cloanto.rp9', - rpm: 'application/x-redhat-package-manager', - rpss: 'application/vnd.nokia.radio-presets', - rpst: 'application/vnd.nokia.radio-preset', - rq: 'application/sparql-query', - rs: 'application/rls-services+xml', - rsat: 'application/atsc-rsat+xml', - rsd: 'application/rsd+xml', - rsheet: 'application/urc-ressheet+xml', - rss: 'application/rss+xml', - rtf: 'text/rtf', - rtx: 'text/richtext', - run: 'application/x-makeself', - rusd: 'application/route-usd+xml', - s: 'text/x-asm', - s3m: 'audio/s3m', - saf: 'application/vnd.yamaha.smaf-audio', - sass: 'text/x-sass', - 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', - scss: 'text/x-scss', - 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', - sea: 'application/x-sea', - see: 'application/vnd.seemail', - seed: 'application/vnd.fdsn.seed', - sema: 'application/vnd.sema', - semd: 'application/vnd.semd', - semf: 'application/vnd.semf', - senmlx: 'application/senml+xml', - sensmlx: 'application/sensml+xml', - 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', - shex: 'text/shex', - shf: 'application/shf+xml', - shtml: 'text/html', - sid: 'image/x-mrsid-image', - sieve: 'application/sieve', - 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', - siv: 'application/sieve', - 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', - slim: 'text/slim', - slm: 'text/slim', - sls: 'application/route-s-tsid+xml', - 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', - spdx: 'text/spdx', - 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: 'model/stl', - stpx: 'model/step+xml', - stpxz: 'model/step-xml+zip', - stpz: 'model/step+zip', - str: 'application/vnd.pg.format', - stw: 'application/vnd.sun.xml.writer.template', - styl: 'text/stylus', - stylus: 'text/stylus', - 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', - swidtag: 'application/swid+xml', - 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', - t38: 'image/t38', - taglet: 'application/vnd.mynfc', - tao: 'application/vnd.tao.intent-module-archive', - tap: 'image/vnd.tencent.tap', - tar: 'application/x-tar', - tcap: 'application/vnd.3gpp2.tcap', - tcl: 'application/x-tcl', - td: 'application/urc-targetdesc+xml', - 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', - tfx: 'image/tiff-fx', - tga: 'image/x-tga', - thmx: 'application/vnd.ms-officetheme', - tif: 'image/tiff', - tiff: 'image/tiff', - tk: 'application/x-tcl', - tmo: 'application/vnd.tmobile-livetv', - toml: 'application/toml', - torrent: 'application/x-bittorrent', - tpl: 'application/vnd.groove-tool-template', - tpt: 'application/vnd.trid.tpt', - tr: 'text/troff', - tra: 'application/vnd.trueapp', - trig: 'application/trig', - trm: 'application/x-msterminal', - ts: 'video/mp2t', - tsd: 'application/timestamped-data', - tsv: 'text/tab-separated-values', - ttc: 'font/collection', - ttf: 'font/ttf', - ttl: 'text/turtle', - ttml: 'application/ttml+xml', - 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', - u8dsn: 'message/global-delivery-status', - u8hdr: 'message/global-headers', - u8mdn: 'message/global-disposition-notification', - u8msg: 'message/global', - ubj: 'application/ubjson', - 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', - usdz: 'model/vnd.usdz+zip', - 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', - vbox: 'application/x-virtualbox-vbox', - 'vbox-extpack': 'application/x-virtualbox-vbox-extpack', - vcard: 'text/vcard', - vcd: 'application/x-cdlink', - vcf: 'text/x-vcard', - vcg: 'application/vnd.groove-vcard', - vcs: 'text/x-vcalendar', - vcx: 'application/vnd.vcx', - vdi: 'application/x-virtualbox-vdi', - vds: 'model/vnd.sap.vds', - vhd: 'application/x-virtualbox-vhd', - vis: 'application/vnd.visionary', - viv: 'video/vnd.vivo', - vmdk: 'application/x-virtualbox-vmdk', - 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', - vtf: 'image/vnd.valve.source.texture', - vtt: 'text/vtt', - vtu: 'model/vnd.vtu', - vxml: 'application/voicexml+xml', - w3d: 'application/x-director', - wad: 'application/x-doom', - wadl: 'application/vnd.sun.wadl+xml', - war: 'application/java-archive', - wasm: 'application/wasm', - 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', - webapp: 'application/x-web-app-manifest+json', - webm: 'video/webm', - webmanifest: 'application/manifest+json', - 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: 'image/wmf', - 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: 'font/woff', - woff2: 'font/woff2', - 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', - wsc: 'message/vnd.wfa.wsc', - 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+fastinfoset', - x3dbz: 'model/x3d+binary', - x3dv: 'model/x3d-vrml', - x3dvz: 'model/x3d+vrml', - x3dz: 'model/x3d+xml', - x_b: 'model/vnd.parasolid.transmit.binary', - x_t: 'model/vnd.parasolid.transmit.text', - xaml: 'application/xaml+xml', - xap: 'application/x-silverlight-app', - xar: 'application/vnd.xara', - xav: 'application/xcap-att+xml', - xbap: 'application/x-ms-xbap', - xbd: 'application/vnd.fujixerox.docuworks.binder', - xbm: 'image/x-xbitmap', - xca: 'application/xcap-caps+xml', - xcs: 'application/calendar+xml', - 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', - xel: 'application/xcap-el+xml', - 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/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: 'text/xml', - xns: 'application/xcap-ns+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', - xsd: 'application/xml', - xsl: 'application/xslt+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', - yaml: 'text/yaml', - yang: 'application/yang', - yin: 'application/yin+xml', - yml: 'text/yaml', - ymp: 'text/x-suse-ymp', - 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', + switch (ext) { + case '': + case 'html': + case 'shtml': + case 'htm': + case 'php': + case 'asp': + case 'aspx': + case 'xhtml': + return LikelyType.HTML + + case '3dml': + case 'appcache': + case 'asm': + case 'c': + case 'cc': + case 'coffee': + case 'conf': + case 'cpp': + case 'css': + case 'csv': + case 'curl': + case 'cxx': + case 'dcurl': + case 'def': + case 'dic': + case 'dsc': + case 'etx': + case 'f': + case 'f77': + case 'f90': + case 'flx': + case 'fly': + case 'for': + case 'ged': + case 'gv': + case 'h': + case 'hbs': + case 'hh': + case 'htc': + case 'ics': + case 'ifb': + case 'in': + case 'ini': + case 'jad': + case 'jade': + case 'java': + case 'jsx': + case 'less': + case 'list': + case 'litcoffee': + case 'log': + case 'lua': + case 'man': + case 'manifest': + case 'markdown': + case 'mcurl': + case 'md': + case 'mdx': + case 'me': + case 'mkd': + case 'mml': + case 'ms': + case 'n3': + case 'nfo': + case 'opml': + case 'org': + case 'p': + case 'pas': + case 'pde': + case 'roff': + case 'rtf': + case 'rtx': + case 's': + case 'sass': + case 'scss': + case 'scurl': + case 'sfv': + case 'sgm': + case 'sgml': + case 'shex': + case 'slim': + case 'slm': + case 'spdx': + case 'spot': + case 'styl': + case 'stylus': + case 'sub': + case 't': + case 'text': + case 'tr': + case 'tsv': + case 'ttl': + case 'txt': + case 'uri': + case 'uris': + case 'urls': + case 'uu': + case 'vcard': + case 'vcf': + case 'vcs': + case 'vtt': + case 'wml': + case 'wmls': + case 'xml': + case 'yaml': + case 'yml': + case 'ymp': + return LikelyType.Text + + case '3ds': + case 'apng': + case 'avif': + case 'azv': + case 'b16': + case 'bmp': + case 'btif': + case 'cgm': + case 'cmx': + case 'dds': + case 'djv': + case 'djvu': + case 'drle': + case 'dwg': + case 'dxf': + case 'emf': + case 'exr': + case 'fbs': + case 'fh': + case 'fh4': + case 'fh5': + case 'fh7': + case 'fhc': + case 'fits': + case 'fpx': + case 'fst': + case 'g3': + case 'gif': + case 'heic': + case 'heics': + case 'heif': + case 'heifs': + case 'hej2': + case 'hsj2': + case 'ico': + case 'ief': + case 'jhc': + case 'jls': + case 'jng': + case 'jp2': + case 'jpe': + case 'jpeg': + case 'jpf': + case 'jpg': + case 'jpg2': + case 'jph': + case 'jpx': + case 'jxr': + case 'jxra': + case 'jxrs': + case 'jxs': + case 'jxsc': + case 'jxsi': + case 'jxss': + case 'ktx': + case 'ktx2': + case 'mdi': + case 'mmr': + case 'npx': + case 'pbm': + case 'pct': + case 'pcx': + case 'pgm': + case 'pic': + case 'png': + case 'pnm': + case 'ppm': + case 'psd': + case 'pti': + case 'ras': + case 'rgb': + case 'rlc': + case 'sgi': + case 'sid': + case 'svg': + case 'svgz': + case 't38': + case 'tap': + case 'tfx': + case 'tga': + case 'tif': + case 'tiff': + case 'uvg': + case 'uvi': + case 'uvvg': + case 'uvvi': + case 'vtf': + case 'wbmp': + case 'wdp': + case 'webp': + case 'wmf': + case 'xbm': + case 'xif': + case 'xpm': + case 'xwd': + return LikelyType.Image + + case '3g2': + case '3gp': + case '3gpp': + case 'asf': + case 'asx': + case 'avi': + case 'dvb': + case 'f4v': + case 'fli': + case 'flv': + case 'fvt': + case 'h261': + case 'h263': + case 'h264': + case 'jpgm': + case 'jpgv': + case 'jpm': + case 'm1v': + case 'm2v': + case 'm4s': + case 'm4u': + case 'm4v': + case 'mj2': + case 'mjp2': + case 'mk3d': + case 'mks': + case 'mkv': + case 'mng': + case 'mov': + case 'movie': + case 'mp4': + case 'mp4v': + case 'mpe': + case 'mpeg': + case 'mpg': + case 'mpg4': + case 'mxu': + case 'ogv': + case 'pyv': + case 'qt': + case 'smv': + case 'ts': + case 'uvh': + case 'uvm': + case 'uvp': + case 'uvs': + case 'uvu': + case 'uvv': + case 'uvvh': + case 'uvvm': + case 'uvvp': + case 'uvvs': + case 'uvvu': + case 'uvvv': + case 'viv': + case 'vob': + case 'webm': + case 'wm': + case 'wmv': + case 'wmx': + case 'wvx': + return LikelyType.Video + + case 'aac': + case 'adp': + case 'aif': + case 'aifc': + case 'aiff': + case 'amr': + case 'au': + case 'caf': + case 'dra': + case 'dts': + case 'dtshd': + case 'ecelp4800': + case 'ecelp7470': + case 'ecelp9600': + case 'eol': + case 'flac': + case 'kar': + case 'lvp': + case 'm2a': + case 'm3a': + case 'm3u': + case 'm4a': + case 'mid': + case 'midi': + case 'mka': + case 'mp2': + case 'mp2a': + case 'mp3': + case 'mp4a': + case 'mpga': + case 'mxmf': + case 'oga': + case 'ogg': + case 'opus': + case 'pya': + case 'ra': + case 'ram': + case 'rip': + case 'rmi': + case 'rmp': + case 's3m': + case 'sil': + case 'snd': + case 'spx': + case 'uva': + case 'uvva': + case 'wav': + case 'wax': + case 'weba': + case 'wma': + case 'xm': + return LikelyType.Audio + + case '123': + case '1km': + case '3mf': + case '7z': + case 'aab': + case 'aam': + case 'aas': + case 'abw': + case 'ac': + case 'acc': + case 'ace': + case 'acu': + case 'acutc': + case 'aep': + case 'afm': + case 'afp': + case 'age': + case 'ahead': + case 'ai': + case 'air': + case 'ait': + case 'ami': + case 'apk': + case 'application': + case 'apr': + case 'arc': + case 'arj': + case 'asc': + case 'aso': + case 'atc': + case 'atom': + case 'atomcat': + case 'atomdeleted': + case 'atomsvc': + case 'atx': + case 'aw': + case 'azf': + case 'azs': + case 'azw': + case 'bat': + case 'bcpio': + case 'bdf': + case 'bdm': + case 'bdoc': + case 'bed': + case 'bh2': + case 'bin': + case 'blb': + case 'blorb': + case 'bmi': + case 'bmml': + case 'book': + case 'box': + case 'boz': + case 'bpk': + case 'bsp': + case 'buffer': + case 'bz': + case 'bz2': + case 'c11amc': + case 'c11amz': + case 'c4d': + case 'c4f': + case 'c4g': + case 'c4p': + case 'c4u': + case 'cab': + case 'cap': + case 'car': + case 'cat': + case 'cb7': + case 'cba': + case 'cbr': + case 'cbt': + case 'cbz': + case 'cco': + case 'cct': + case 'ccxml': + case 'cdbcmsg': + case 'cdf': + case 'cdfx': + case 'cdkey': + case 'cdmia': + case 'cdmic': + case 'cdmid': + case 'cdmio': + case 'cdmiq': + case 'cdx': + case 'cdxml': + case 'cdy': + case 'cer': + case 'cfs': + case 'chat': + case 'chm': + case 'chrt': + case 'cif': + case 'cii': + case 'cil': + case 'cjs': + case 'cla': + case 'class': + case 'clkk': + case 'clkp': + case 'clkt': + case 'clkw': + case 'clkx': + case 'clp': + case 'cmc': + case 'cmdf': + case 'cml': + case 'cmp': + case 'cod': + case 'com': + case 'cpio': + case 'cpt': + case 'crd': + case 'crl': + case 'crt': + case 'crx': + case 'cryptonote': + case 'csh': + case 'csl': + case 'csml': + case 'csp': + case 'cst': + case 'cu': + case 'cww': + case 'cxt': + case 'dae': + case 'daf': + case 'dart': + case 'dataless': + case 'davmount': + case 'dbf': + case 'dbk': + case 'dcr': + case 'dd2': + case 'ddd': + case 'ddf': + case 'deb': + case 'deploy': + case 'der': + case 'dfac': + case 'dgc': + case 'dir': + case 'dis': + case 'disposition-notification': + case 'dist': + case 'distz': + case 'dll': + case 'dmg': + case 'dmp': + case 'dms': + case 'dna': + case 'doc': + case 'docm': + case 'docx': + case 'dot': + case 'dotm': + case 'dotx': + case 'dp': + case 'dpg': + case 'dssc': + case 'dtb': + case 'dtd': + case 'dump': + case 'dvi': + case 'dwd': + case 'dwf': + case 'dxp': + case 'dxr': + case 'ear': + case 'ecma': + case 'edm': + case 'edx': + case 'efif': + case 'ei6': + case 'elc': + case 'eml': + case 'emma': + case 'emotionml': + case 'emz': + case 'eot': + case 'eps': + case 'epub': + case 'es': + case 'es3': + case 'esa': + case 'esf': + case 'et3': + case 'eva': + case 'evy': + case 'exe': + case 'exi': + case 'exp': + case 'ext': + case 'ez': + case 'ez2': + case 'ez3': + case 'fcdt': + case 'fcs': + case 'fdf': + case 'fdt': + case 'fe_launch': + case 'fg5': + case 'fgd': + case 'fig': + case 'flo': + case 'flw': + case 'fm': + case 'fnc': + case 'fo': + case 'frame': + case 'fsc': + case 'ftc': + case 'fti': + case 'fxp': + case 'fxpl': + case 'fzs': + case 'g2w': + case 'g3w': + case 'gac': + case 'gam': + case 'gbr': + case 'gca': + case 'gdl': + case 'gdoc': + case 'geo': + case 'geojson': + case 'gex': + case 'ggb': + case 'ggt': + case 'ghf': + case 'gim': + case 'glb': + case 'gltf': + case 'gml': + case 'gmx': + case 'gnumeric': + case 'gph': + case 'gpx': + case 'gqf': + case 'gqs': + case 'gram': + case 'gramps': + case 'gre': + case 'grv': + case 'grxml': + case 'gsf': + case 'gsheet': + case 'gslides': + case 'gtar': + case 'gtm': + case 'gtw': + case 'gxf': + case 'gxt': + case 'gz': + case 'hal': + case 'hbci': + case 'hdd': + case 'hdf': + case 'held': + case 'hjson': + case 'hlp': + case 'hpgl': + case 'hpid': + case 'hps': + case 'hqx': + case 'htke': + case 'hvd': + case 'hvp': + case 'hvs': + case 'i2g': + case 'icc': + case 'ice': + case 'icm': + case 'ifm': + case 'iges': + case 'igl': + case 'igm': + case 'igs': + case 'igx': + case 'iif': + case 'img': + case 'imp': + case 'ims': + case 'ink': + case 'inkml': + case 'install': + case 'iota': + case 'ipfix': + case 'ipk': + case 'irm': + case 'irp': + case 'iso': + case 'itp': + case 'its': + case 'ivp': + case 'ivu': + case 'jam': + case 'jar': + case 'jardiff': + case 'jisp': + case 'jlt': + case 'jnlp': + case 'joda': + case 'js': + case 'json': + case 'json5': + case 'jsonld': + case 'jsonml': + case 'karbon': + case 'kdbx': + case 'key': + case 'kfo': + case 'kia': + case 'kml': + case 'kmz': + case 'kne': + case 'knp': + case 'kon': + case 'kpr': + case 'kpt': + case 'kpxx': + case 'ksp': + case 'ktr': + case 'ktz': + case 'kwd': + case 'kwt': + case 'lasxml': + case 'latex': + case 'lbd': + case 'lbe': + case 'les': + case 'lgr': + case 'lha': + case 'link66': + case 'list3820': + case 'listafp': + case 'lnk': + case 'lostxml': + case 'lrf': + case 'lrm': + case 'ltf': + case 'luac': + case 'lwp': + case 'lzh': + case 'm13': + case 'm14': + case 'm21': + case 'm3u8': + case 'm4p': + case 'ma': + case 'mads': + case 'maei': + case 'mag': + case 'maker': + case 'map': + case 'mar': + case 'mathml': + case 'mb': + case 'mbk': + case 'mbox': + case 'mc1': + case 'mcd': + case 'mdb': + case 'mesh': + case 'meta4': + case 'metalink': + case 'mets': + case 'mfm': + case 'mft': + case 'mgp': + case 'mgz': + case 'mie': + case 'mif': + case 'mime': + case 'mjs': + case 'mlp': + case 'mmd': + case 'mmf': + case 'mny': + case 'mobi': + case 'mods': + case 'mp21': + case 'mp4s': + case 'mpc': + case 'mpd': + case 'mpkg': + case 'mpm': + case 'mpn': + case 'mpp': + case 'mpt': + case 'mpy': + case 'mqy': + case 'mrc': + case 'mrcx': + case 'mscml': + case 'mseed': + case 'mseq': + case 'msf': + case 'msg': + case 'msh': + case 'msi': + case 'msl': + case 'msm': + case 'msp': + case 'msty': + case 'mtl': + case 'mts': + case 'mus': + case 'musd': + case 'musicxml': + case 'mvb': + case 'mvt': + case 'mwf': + case 'mxf': + case 'mxl': + case 'mxml': + case 'mxs': + case 'n-gage': + case 'nb': + case 'nbp': + case 'nc': + case 'ncx': + case 'ngdat': + case 'nitf': + case 'nlu': + case 'nml': + case 'nnd': + case 'nns': + case 'nnw': + case 'nq': + case 'nsc': + case 'nsf': + case 'nt': + case 'ntf': + case 'numbers': + case 'nzb': + case 'oa2': + case 'oa3': + case 'oas': + case 'obd': + case 'obgx': + case 'obj': + case 'oda': + case 'odb': + case 'odc': + case 'odf': + case 'odft': + case 'odg': + case 'odi': + case 'odm': + case 'odp': + case 'ods': + case 'odt': + case 'ogex': + case 'ogx': + case 'omdoc': + case 'onepkg': + case 'onetmp': + case 'onetoc': + case 'onetoc2': + case 'opf': + case 'oprc': + case 'osf': + case 'osfpvg': + case 'osm': + case 'otc': + case 'otf': + case 'otg': + case 'oth': + case 'oti': + case 'otp': + case 'ots': + case 'ott': + case 'ova': + case 'ovf': + case 'owl': + case 'oxps': + case 'oxt': + case 'p10': + case 'p12': + case 'p7b': + case 'p7c': + case 'p7m': + case 'p7r': + case 'p7s': + case 'p8': + case 'pac': + case 'pages': + case 'paw': + case 'pbd': + case 'pcap': + case 'pcf': + case 'pcl': + case 'pclxl': + case 'pcurl': + case 'pdb': + case 'pdf': + case 'pem': + case 'pfa': + case 'pfb': + case 'pfm': + case 'pfr': + case 'pfx': + case 'pgn': + case 'pgp': + case 'pkg': + case 'pki': + case 'pkipath': + case 'pkpass': + case 'pl': + case 'plb': + case 'plc': + case 'plf': + case 'pls': + case 'pm': + case 'pml': + case 'portpkg': + case 'pot': + case 'potm': + case 'potx': + case 'ppam': + case 'ppd': + case 'pps': + case 'ppsm': + case 'ppsx': + case 'ppt': + case 'pptm': + case 'pptx': + case 'pqa': + case 'prc': + case 'pre': + case 'prf': + case 'provx': + case 'ps': + case 'psb': + case 'psf': + case 'pskcxml': + case 'ptid': + case 'pub': + case 'pvb': + case 'pwn': + case 'qam': + case 'qbo': + case 'qfx': + case 'qps': + case 'qwd': + case 'qwt': + case 'qxb': + case 'qxd': + case 'qxl': + case 'qxt': + case 'raml': + case 'rapd': + case 'rar': + case 'rcprofile': + case 'rdf': + case 'rdz': + case 'relo': + case 'rep': + case 'res': + case 'rif': + case 'ris': + case 'rl': + case 'rld': + case 'rm': + case 'rms': + case 'rmvb': + case 'rnc': + case 'rng': + case 'roa': + case 'rp9': + case 'rpm': + case 'rpss': + case 'rpst': + case 'rq': + case 'rs': + case 'rsat': + case 'rsd': + case 'rsheet': + case 'rss': + case 'run': + case 'rusd': + case 'saf': + case 'sbml': + case 'sc': + case 'scd': + case 'scm': + case 'scq': + case 'scs': + case 'sda': + case 'sdc': + case 'sdd': + case 'sdkd': + case 'sdkm': + case 'sdp': + case 'sdw': + case 'sea': + case 'see': + case 'seed': + case 'sema': + case 'semd': + case 'semf': + case 'senmlx': + case 'sensmlx': + case 'ser': + case 'setpay': + case 'setreg': + case 'sfd-hdstx': + case 'sfs': + case 'sgl': + case 'sh': + case 'shar': + case 'shf': + case 'sieve': + case 'sig': + case 'silo': + case 'sis': + case 'sisx': + case 'sit': + case 'sitx': + case 'siv': + case 'skd': + case 'skm': + case 'skp': + case 'skt': + case 'sldm': + case 'sldx': + case 'sls': + case 'slt': + case 'sm': + case 'smf': + case 'smi': + case 'smil': + case 'smzip': + case 'snf': + case 'so': + case 'spc': + case 'spf': + case 'spl': + case 'spp': + case 'spq': + case 'sql': + case 'src': + case 'srt': + case 'sru': + case 'srx': + case 'ssdl': + case 'sse': + case 'ssf': + case 'ssml': + case 'st': + case 'stc': + case 'std': + case 'stf': + case 'sti': + case 'stk': + case 'stl': + case 'stpx': + case 'stpxz': + case 'stpz': + case 'str': + case 'stw': + case 'sus': + case 'susp': + case 'sv4cpio': + case 'sv4crc': + case 'svc': + case 'svd': + case 'swa': + case 'swf': + case 'swi': + case 'swidtag': + case 'sxc': + case 'sxd': + case 'sxg': + case 'sxi': + case 'sxm': + case 'sxw': + case 't3': + case 'taglet': + case 'tao': + case 'tar': + case 'tcap': + case 'tcl': + case 'td': + case 'teacher': + case 'tei': + case 'teicorpus': + case 'tex': + case 'texi': + case 'texinfo': + case 'tfi': + case 'tfm': + case 'thmx': + case 'tk': + case 'tmo': + case 'toml': + case 'torrent': + case 'tpl': + case 'tpt': + case 'tra': + case 'trig': + case 'trm': + case 'tsd': + case 'ttc': + case 'ttf': + case 'ttml': + case 'twd': + case 'twds': + case 'txd': + case 'txf': + case 'u32': + case 'u8dsn': + case 'u8hdr': + case 'u8mdn': + case 'u8msg': + case 'ubj': + case 'udeb': + case 'ufd': + case 'ufdl': + case 'ulx': + case 'umj': + case 'unityweb': + case 'uoml': + case 'usdz': + case 'ustar': + case 'utz': + case 'uvd': + case 'uvf': + case 'uvt': + case 'uvvd': + case 'uvvf': + case 'uvvt': + case 'uvvx': + case 'uvvz': + case 'uvx': + case 'uvz': + case 'vbox': + case 'vbox-extpack': + case 'vcd': + case 'vcg': + case 'vcx': + case 'vdi': + case 'vds': + case 'vhd': + case 'vis': + case 'vmdk': + case 'vor': + case 'vox': + case 'vrml': + case 'vsd': + case 'vsf': + case 'vss': + case 'vst': + case 'vsw': + case 'vtu': + case 'vxml': + case 'w3d': + case 'wad': + case 'wadl': + case 'war': + case 'wasm': + case 'wbs': + case 'wbxml': + case 'wcm': + case 'wdb': + case 'webapp': + case 'webmanifest': + case 'wg': + case 'wgt': + case 'wks': + case 'wmd': + case 'wmlc': + case 'wmlsc': + case 'wmz': + case 'woff': + case 'woff2': + case 'wpd': + case 'wpl': + case 'wps': + case 'wqd': + case 'wri': + case 'wrl': + case 'wsc': + case 'wsdl': + case 'wspolicy': + case 'wtb': + case 'x32': + case 'x3d': + case 'x3db': + case 'x3dbz': + case 'x3dv': + case 'x3dvz': + case 'x3dz': + case 'x_b': + case 'x_t': + case 'xaml': + case 'xap': + case 'xar': + case 'xav': + case 'xbap': + case 'xbd': + case 'xca': + case 'xcs': + case 'xdf': + case 'xdm': + case 'xdp': + case 'xdssc': + case 'xdw': + case 'xel': + case 'xenc': + case 'xer': + case 'xfdf': + case 'xfdl': + case 'xht': + case 'xhvml': + case 'xla': + case 'xlam': + case 'xlc': + case 'xlf': + case 'xlm': + case 'xls': + case 'xlsb': + case 'xlsm': + case 'xlsx': + case 'xlt': + case 'xltm': + case 'xltx': + case 'xlw': + case 'xns': + case 'xo': + case 'xop': + case 'xpi': + case 'xpl': + case 'xpr': + case 'xps': + case 'xpw': + case 'xpx': + case 'xsd': + case 'xsl': + case 'xslt': + case 'xsm': + case 'xspf': + case 'xul': + case 'xvm': + case 'xvml': + case 'xyz': + case 'xz': + case 'yang': + case 'yin': + case 'z1': + case 'z2': + case 'z3': + case 'z4': + case 'z5': + case 'z6': + case 'z7': + case 'z8': + case 'zaz': + case 'zip': + case 'zir': + case 'zirz': + case 'zmm': + return LikelyType.Other + + default: + // Unknown extension - assume HTML + return LikelyType.HTML + } }