UNPKG

ember-hifi

Version:

The easy way to play audio in your ember app.

230 lines (215 loc) 4.89 kB
// we are only concerned with a subset of all available mime types // data and function lifted from https://github.com/jshttp/mime-db const MIME_TYPES = { "audio/3gpp": { "source": "iana", "extensions": ["3gpp"] }, "audio/adpcm": { "source": "apache", "extensions": ["adp"] }, "audio/aac": { "compressible": false, "extensions": ["aac"] }, "audio/basic": { "source": "iana", "compressible": false, "extensions": ["au","snd"] }, "audio/midi": { "source": "apache", "extensions": ["mid","midi","kar","rmi"] }, "audio/mp3": { "compressible": false, "extensions": ["mp3"] }, "audio/mp4": { "source": "iana", "compressible": false, "extensions": ["m4a","mp4a"] }, "audio/mpeg": { "source": "iana", "compressible": false, "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] }, "audio/ogg": { "source": "iana", "compressible": false, "extensions": ["oga","ogg","spx"] }, "audio/s3m": { "source": "apache", "extensions": ["s3m"] }, "audio/silk": { "source": "apache", "extensions": ["sil"] }, "audio/vnd.dece.audio": { "source": "iana", "extensions": ["uva","uvva"] }, "audio/vnd.digital-winds": { "source": "iana", "extensions": ["eol"] }, "audio/vnd.dra": { "source": "iana", "extensions": ["dra"] }, "audio/vnd.dts": { "source": "iana", "extensions": ["dts"] }, "audio/vnd.dts.hd": { "source": "iana", "extensions": ["dtshd"] }, "audio/vnd.lucent.voice": { "source": "iana", "extensions": ["lvp"] }, "audio/vnd.ms-playready.media.pya": { "source": "iana", "extensions": ["pya"] }, "audio/vnd.nuera.ecelp4800": { "source": "iana", "extensions": ["ecelp4800"] }, "audio/vnd.nuera.ecelp7470": { "source": "iana", "extensions": ["ecelp7470"] }, "audio/vnd.nuera.ecelp9600": { "source": "iana", "extensions": ["ecelp9600"] }, "audio/vnd.rip": { "source": "iana", "extensions": ["rip"] }, "audio/wav": { "compressible": false, "extensions": ["wav"] }, "audio/wave": { "compressible": false, "extensions": ["wav"] }, "audio/webm": { "source": "apache", "compressible": false, "extensions": ["weba"] }, "audio/x-aiff": { "source": "apache", "extensions": ["aif","aiff","aifc"] }, "audio/x-caf": { "source": "apache", "compressible": false, "extensions": ["caf"] }, "audio/x-flac": { "source": "apache", "extensions": ["flac"] }, "audio/x-m4a": { "source": "nginx", "extensions": ["m4a"] }, "audio/x-matroska": { "source": "apache", "extensions": ["mka"] }, "audio/x-mpegurl": { "source": "apache", "extensions": ["m3u"] }, "audio/x-ms-wax": { "source": "apache", "extensions": ["wax"] }, "audio/x-ms-wma": { "source": "apache", "extensions": ["wma"] }, "audio/x-pn-realaudio": { "source": "apache", "extensions": ["ram","ra"] }, "audio/x-pn-realaudio-plugin": { "source": "apache", "extensions": ["rmp"] }, "audio/x-realaudio": { "source": "nginx", "extensions": ["ra"] }, "audio/x-wav": { "source": "apache", "extensions": ["wav"] }, "audio/xm": { "source": "apache", "extensions": ["xm"] }, "application/vnd.apple.mpegurl": { "source": "iana", "extensions": ["m3u8"] }, "audio/x-mpepgurl": { "source": "apache", "extensions": ["m3u"] } }; const TYPES = Object.create(null); const EXTENSIONS = Object.create(null); function populateMaps(extensions, types) { // source preference (least -> most) let preference = ['nginx', 'apache', undefined, 'iana']; Object.keys(MIME_TYPES).forEach(function(type) { let mime = MIME_TYPES[type]; let exts = mime.extensions; if (!exts || !exts.length) { return false; } // mime -> extensions extensions[type] = exts; // extension -> mime for (let i = 0; i < exts.length; i++) { let extension = exts[i]; if (types[extension]) { let start = preference.indexOf(MIME_TYPES[types[extension]].source); let end = preference.indexOf(mime.source); if (types[extension] !== 'application/octet-stream' && start > end || (start === end && types[extension].substr(0, 12) === 'application/')) { // skip the remapping continue; } } // set the extension -> mime types[extension] = type; } }); } populateMaps(EXTENSIONS, TYPES); export function getMimeType(url) { if (!url || typeof url !== 'string') { return false; } let extension = url .toLowerCase() .split('.').pop() .split('?').shift() .split('#').shift(); if (!extension) { return false; } return TYPES[extension] || false; }