-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy paththumbnail.utils.ts
More file actions
94 lines (87 loc) · 2.53 KB
/
thumbnail.utils.ts
File metadata and controls
94 lines (87 loc) · 2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import { Readable } from 'node:stream';
import { NetworkFacade } from '../services/network/network-facade.service';
import { ThumbnailService } from '../services/thumbnail.service';
import { ErrorUtils } from './errors.utils';
import { BufferStream } from './stream.utils';
import { createReadStream } from 'node:fs';
export const ThumbnailConfig = {
MaxWidth: 300,
MaxHeight: 300,
Quality: 100,
Type: 'png',
} as const;
type FileExtensionMap = Record<string, string[]>;
const imageExtensions: FileExtensionMap = {
tiff: ['tif', 'tiff'],
bmp: ['bmp'],
heic: ['heic'],
jpg: ['jpg', 'jpeg'],
gif: ['gif'],
png: ['png'],
eps: ['eps'],
raw: ['raw', 'cr2', 'nef', 'orf', 'sr2'],
webp: ['webp'],
};
const pdfExtensions: FileExtensionMap = {
pdf: ['pdf'],
};
const thumbnailableImageExtension: string[] = [
...imageExtensions['jpg'],
...imageExtensions['png'],
...imageExtensions['webp'],
...imageExtensions['gif'],
...imageExtensions['tiff'],
];
const thumbnailablePdfExtension: string[] = pdfExtensions['pdf'];
const thumbnailableExtension: string[] = [...thumbnailableImageExtension];
export const isFileThumbnailable = (fileType: string) => {
return fileType.trim().length > 0 && thumbnailableExtension.includes(fileType.trim().toLowerCase());
};
export const isPDFThumbnailable = (fileType: string) => {
return fileType.trim().length > 0 && thumbnailablePdfExtension.includes(fileType.trim().toLowerCase());
};
export const isImageThumbnailable = (fileType: string) => {
return fileType.trim().length > 0 && thumbnailableImageExtension.includes(fileType.trim().toLowerCase());
};
export const tryUploadThumbnail = async ({
bufferStream,
fileType,
userBucket,
fileUuid,
networkFacade,
}: {
bufferStream: BufferStream;
fileType: string;
userBucket: string;
fileUuid: string;
networkFacade: NetworkFacade;
}) => {
try {
const thumbnailBuffer = bufferStream.getBuffer();
if (thumbnailBuffer) {
await ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, userBucket, fileUuid, networkFacade);
}
} catch (error) {
ErrorUtils.report(error);
}
};
export const createFileStreamWithBuffer = ({
path,
fileType,
}: {
path: string;
fileType: string;
}): {
bufferStream?: BufferStream;
fileStream: Readable;
} => {
const readable: Readable = createReadStream(path);
if (isFileThumbnailable(fileType)) {
const bufferStream = new BufferStream();
return {
bufferStream,
fileStream: readable.pipe(bufferStream),
};
}
return { fileStream: readable };
};