@@ -3,44 +3,61 @@ import { DriveFileService } from './drive/drive-file.service';
33import { StorageTypes } from '@internxt/sdk/dist/drive' ;
44import { NetworkFacade } from './network/network-facade.service' ;
55import { UploadService } from './network/upload.service' ;
6+ import { isImageThumbnailable , ThumbnailConfig } from '../utils/thumbnail.utils' ;
7+ import sharp from 'sharp' ;
68
79export class ThumbnailService {
810 public static readonly instance : ThumbnailService = new ThumbnailService ( ) ;
911
10- public static readonly MaxWidth = 300 ;
11- public static readonly MaxHeight = 300 ;
12- public static readonly Quality = 80 ;
13- public static readonly Type = 'png' ;
14-
1512 public uploadThumbnail = async (
1613 fileContent : Buffer ,
14+ fileType : string ,
1715 userBucket : string ,
1816 userMnemonic : string ,
1917 file_id : number ,
2018 networkFacade : NetworkFacade ,
21- ) : Promise < StorageTypes . Thumbnail > => {
22- const size = fileContent . length ;
23- const [ thumbnailPromise ] = await UploadService . instance . uploadFileStream (
24- Readable . from ( fileContent ) ,
25- userBucket ,
26- userMnemonic ,
27- size ,
28- networkFacade ,
29- ( ) => { } ,
30- ) ;
19+ ) : Promise < StorageTypes . Thumbnail | undefined > => {
20+ let thumbnailBuffer : Buffer | undefined ;
21+ if ( isImageThumbnailable ( fileType ) ) {
22+ thumbnailBuffer = await this . getThumbnailFromImageBuffer ( fileContent ) ;
23+ }
24+ if ( thumbnailBuffer ) {
25+ const size = thumbnailBuffer . length ;
26+ const [ thumbnailPromise ] = await UploadService . instance . uploadFileStream (
27+ Readable . from ( thumbnailBuffer ) ,
28+ userBucket ,
29+ userMnemonic ,
30+ size ,
31+ networkFacade ,
32+ ( ) => { } ,
33+ ) ;
34+
35+ const thumbnailUploadResult = await thumbnailPromise ;
3136
32- const thumbnailUploadResult = await thumbnailPromise ;
37+ const createdThumbnailFile = await DriveFileService . instance . createThumbnail ( {
38+ file_id : file_id ,
39+ max_width : ThumbnailConfig . MaxWidth ,
40+ max_height : ThumbnailConfig . MaxHeight ,
41+ type : ThumbnailConfig . Type ,
42+ size : size ,
43+ bucket_id : userBucket ,
44+ bucket_file : thumbnailUploadResult . fileId ,
45+ encrypt_version : StorageTypes . EncryptionVersion . Aes03 ,
46+ } ) ;
47+ return createdThumbnailFile ;
48+ }
49+ } ;
3350
34- const createdThumbnailFile = await DriveFileService . instance . createThumbnail ( {
35- file_id : file_id ,
36- max_width : ThumbnailService . MaxWidth ,
37- max_height : ThumbnailService . MaxHeight ,
38- type : ThumbnailService . Type ,
39- size : size ,
40- bucket_id : userBucket ,
41- bucket_file : thumbnailUploadResult . fileId ,
42- encrypt_version : StorageTypes . EncryptionVersion . Aes03 ,
43- } ) ;
44- return createdThumbnailFile ;
51+ private getThumbnailFromImageBuffer = ( buffer : Buffer ) : Promise < Buffer > => {
52+ return sharp ( buffer )
53+ . resize ( {
54+ height : ThumbnailConfig . MaxHeight ,
55+ width : ThumbnailConfig . MaxWidth ,
56+ fit : 'inside' ,
57+ } )
58+ . png ( {
59+ quality : ThumbnailConfig . Quality ,
60+ } )
61+ . toBuffer ( ) ;
4562 } ;
4663}
0 commit comments