Add media type sniffing by extension
This commit is contained in:
69
packages/common/src/MediaType.ts
Normal file
69
packages/common/src/MediaType.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
const mediaTypeExtension = new Map<string, string>();
|
||||
const extensionMediaType = new Map<string, string>();
|
||||
|
||||
register("application/x-musescore", "mscz");
|
||||
register("application/vnd.recordare.musicxml+xml", "musicxml");
|
||||
register("application/vnd.recordare.musicxml", "mxl");
|
||||
register("application/pdf", "pdf");
|
||||
|
||||
register("audio/aac", "aac");
|
||||
register("audio/flac", "flac");
|
||||
register("audio/midi", "mid", "midi");
|
||||
register("audio/mpeg", "mp3");
|
||||
register("audio/wav", "wav");
|
||||
|
||||
export const ACCEPTED_EXTENSIONS = (() => {
|
||||
const ret = [];
|
||||
for (const extension of extensionMediaType.keys()) {
|
||||
ret.push("." + extension);
|
||||
}
|
||||
|
||||
ret.sort((a, b) => a.localeCompare(b));
|
||||
return ret.join(",");
|
||||
})();
|
||||
|
||||
function register(mediaType: string, ...extensions: [string, ...string[]]) {
|
||||
const [primaryExtension, ...secondaryExtensions] = extensions;
|
||||
|
||||
mediaTypeExtension.set(mediaType, primaryExtension);
|
||||
|
||||
extensionMediaType.set(primaryExtension, mediaType);
|
||||
for (const extension of secondaryExtensions) {
|
||||
extensionMediaType.set(extension, mediaType);
|
||||
}
|
||||
}
|
||||
|
||||
export function getMediaTypeForExtension(extension: string): string | undefined {
|
||||
return extensionMediaType.get(extension);
|
||||
}
|
||||
|
||||
export function getPrimaryExtension(extension: string): string {
|
||||
const mediaType = extensionMediaType.get(extension);
|
||||
if (mediaType === undefined) {
|
||||
return extension;
|
||||
}
|
||||
|
||||
const primaryExtension = mediaTypeExtension.get(mediaType)!;
|
||||
return primaryExtension;
|
||||
}
|
||||
|
||||
export function getExtensionFromMediaType(mediaType: string): string | undefined {
|
||||
return mediaTypeExtension.get(mediaType);
|
||||
}
|
||||
|
||||
export function getExtensionFromFilename(filename: string): string | undefined {
|
||||
return filename.match(/(?<=.)[^.]+$/)?.[0];
|
||||
}
|
||||
|
||||
export function getMediaTypeForFilename(filename: string): string | undefined {
|
||||
const extension = getExtensionFromFilename(filename);
|
||||
if (extension === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return getMediaTypeForExtension(extension);
|
||||
}
|
||||
|
||||
export function getMediaTypeForFile(file: File): string {
|
||||
return getMediaTypeForFilename(file.name) ?? file.type;
|
||||
}
|
||||
Reference in New Issue
Block a user