Add video support
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import { FileSystem } from 'react-native-file-access';
|
||||
import filetypemime from 'magic-bytes.js';
|
||||
import { lookup } from 'react-native-mime-types';
|
||||
import { MEME_TYPE } from '../database';
|
||||
|
||||
const allowedImageMimeTypes = [
|
||||
@@ -12,43 +13,52 @@ const allowedImageMimeTypes = [
|
||||
|
||||
const allowedGifMimeTypes = ['image/gif'];
|
||||
|
||||
const allowedMimeTypes = [...allowedImageMimeTypes, ...allowedGifMimeTypes];
|
||||
const allowedVideoMimeTypes = [
|
||||
'video/av01',
|
||||
'video/3gpp',
|
||||
'video/avc',
|
||||
'video/hevc',
|
||||
'video/x-matroska',
|
||||
'video/mp2t',
|
||||
'video/mp4',
|
||||
'video/mp42',
|
||||
'video/mp43',
|
||||
'video/mp4v-es',
|
||||
'video/mpeg',
|
||||
'video/mpeg2',
|
||||
'video/x-vnd.on2.vp8',
|
||||
'video/x-vnd.on2.vp9',
|
||||
'video/webm',
|
||||
];
|
||||
|
||||
const allowedMimeTypes = [
|
||||
...allowedImageMimeTypes,
|
||||
...allowedGifMimeTypes,
|
||||
...allowedVideoMimeTypes,
|
||||
];
|
||||
|
||||
const getMemeTypeFromMimeType = (mimeType: string): MEME_TYPE | undefined => {
|
||||
switch (mimeType) {
|
||||
case 'image/bmp':
|
||||
case 'image/jpg':
|
||||
case 'image/jpeg':
|
||||
case 'image/png':
|
||||
case 'image/webp': {
|
||||
if (!allowedMimeTypes.includes(mimeType)) return undefined;
|
||||
|
||||
const mimeStart = mimeType.split('/')[0];
|
||||
|
||||
switch (mimeStart) {
|
||||
case 'image': {
|
||||
if (mimeType === 'image/gif') return MEME_TYPE.GIF;
|
||||
return MEME_TYPE.IMAGE;
|
||||
}
|
||||
case 'image/gif': {
|
||||
return MEME_TYPE.GIF;
|
||||
case 'video': {
|
||||
return MEME_TYPE.VIDEO;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const guessMimeTypeFromExtension = (filename: string): string | undefined => {
|
||||
const extension = filename.split('.').pop()?.toLowerCase();
|
||||
switch (extension) {
|
||||
case 'bmp': {
|
||||
return 'image/bmp';
|
||||
}
|
||||
case 'jpg':
|
||||
case 'jpeg': {
|
||||
return 'image/jpeg';
|
||||
}
|
||||
case 'png': {
|
||||
return 'image/png';
|
||||
}
|
||||
case 'webp': {
|
||||
return 'image/webp';
|
||||
}
|
||||
case 'gif': {
|
||||
return 'image/gif';
|
||||
}
|
||||
}
|
||||
if (!extension) return undefined;
|
||||
const guessedMimeType = lookup(extension);
|
||||
if (!guessedMimeType) return undefined;
|
||||
return guessedMimeType;
|
||||
};
|
||||
|
||||
const guessMimeTypeFromMagicBytes = async (
|
||||
@@ -66,10 +76,15 @@ const guessMimeType = async (
|
||||
): Promise<string | undefined> => {
|
||||
if (hint && allowedMimeTypes.includes(hint)) return hint;
|
||||
|
||||
const guessedMimeType = guessMimeTypeFromExtension(uri);
|
||||
if (guessedMimeType) return guessedMimeType;
|
||||
let guessedMimeType = guessMimeTypeFromExtension(uri);
|
||||
if (guessedMimeType && allowedMimeTypes.includes(guessedMimeType)) {
|
||||
return guessedMimeType;
|
||||
}
|
||||
|
||||
return await guessMimeTypeFromMagicBytes(uri);
|
||||
guessedMimeType = await guessMimeTypeFromMagicBytes(uri);
|
||||
if (guessedMimeType && allowedMimeTypes.includes(guessedMimeType)) {
|
||||
return guessedMimeType;
|
||||
}
|
||||
};
|
||||
|
||||
export {
|
||||
|
Reference in New Issue
Block a user