Add video support

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2023-08-01 14:35:10 +03:00
parent f1f969c8ea
commit b83407f1f4
13 changed files with 358 additions and 158 deletions

View File

@@ -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 {