store file promise in fileObjectUrlPromise
This commit is contained in:
parent
362d4f89ae
commit
974d8d9241
|
@ -1,20 +1,13 @@
|
||||||
import { getToken } from 'utils/common/key';
|
import { getToken } from 'utils/common/key';
|
||||||
import { getFileUrl, getThumbnailUrl } from 'utils/common/apiUtil';
|
import { getFileUrl, getThumbnailUrl } from 'utils/common/apiUtil';
|
||||||
import CryptoWorker from 'utils/crypto';
|
import CryptoWorker from 'utils/crypto';
|
||||||
import {
|
import { generateStreamFromArrayBuffer, convertForPreview } from 'utils/file';
|
||||||
fileIsHEIC,
|
|
||||||
convertHEIC2JPEG,
|
|
||||||
fileNameWithoutExtension,
|
|
||||||
generateStreamFromArrayBuffer,
|
|
||||||
} from 'utils/file';
|
|
||||||
import HTTPService from './HTTPService';
|
import HTTPService from './HTTPService';
|
||||||
import { File, FILE_TYPE } from './fileService';
|
import { File, FILE_TYPE } from './fileService';
|
||||||
import { logError } from 'utils/sentry';
|
import { logError } from 'utils/sentry';
|
||||||
import { decodeMotionPhoto } from './motionPhotoService';
|
|
||||||
import { getMimeTypeFromBlob } from './upload/readFileService';
|
|
||||||
|
|
||||||
class DownloadManager {
|
class DownloadManager {
|
||||||
private fileDownloads = new Map<string, string>();
|
private fileObjectUrlPromise = new Map<string, Promise<string>>();
|
||||||
private thumbnailObjectUrlPromise = new Map<number, Promise<string>>();
|
private thumbnailObjectUrlPromise = new Map<number, Promise<string>>();
|
||||||
|
|
||||||
public async getPreview(file: File) {
|
public async getPreview(file: File) {
|
||||||
|
@ -75,40 +68,23 @@ class DownloadManager {
|
||||||
|
|
||||||
getFile = async (file: File, forPreview = false) => {
|
getFile = async (file: File, forPreview = false) => {
|
||||||
try {
|
try {
|
||||||
if (!this.fileDownloads.get(`${file.id}_${forPreview}`)) {
|
const getFilePromise = (async () => {
|
||||||
// unzip motion photo and return fileBlob of the image for preview
|
|
||||||
const fileStream = await this.downloadFile(file);
|
const fileStream = await this.downloadFile(file);
|
||||||
let fileBlob = await new Response(fileStream).blob();
|
let fileBlob = await new Response(fileStream).blob();
|
||||||
if (forPreview) {
|
if (forPreview) {
|
||||||
if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) {
|
fileBlob = await convertForPreview(file, fileBlob);
|
||||||
const originalName = fileNameWithoutExtension(
|
|
||||||
file.metadata.title
|
|
||||||
);
|
|
||||||
const motionPhoto = await decodeMotionPhoto(
|
|
||||||
fileBlob,
|
|
||||||
originalName
|
|
||||||
);
|
|
||||||
fileBlob = new Blob([motionPhoto.image]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const typeFromExtension =
|
|
||||||
file.metadata.title.split('.')[-1];
|
|
||||||
const worker = await new CryptoWorker();
|
|
||||||
|
|
||||||
const mimeType =
|
|
||||||
(await getMimeTypeFromBlob(worker, fileBlob)) ??
|
|
||||||
typeFromExtension;
|
|
||||||
|
|
||||||
if (fileIsHEIC(mimeType)) {
|
|
||||||
fileBlob = await convertHEIC2JPEG(fileBlob);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.fileDownloads.set(
|
return URL.createObjectURL(fileBlob);
|
||||||
|
})();
|
||||||
|
if (!this.fileObjectUrlPromise.get(`${file.id}_${forPreview}`)) {
|
||||||
|
this.fileObjectUrlPromise.set(
|
||||||
`${file.id}_${forPreview}`,
|
`${file.id}_${forPreview}`,
|
||||||
URL.createObjectURL(fileBlob)
|
getFilePromise
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return this.fileDownloads.get(`${file.id}_${forPreview}`);
|
return await this.fileObjectUrlPromise.get(
|
||||||
|
`${file.id}_${forPreview}`
|
||||||
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError(e, 'Failed to get File');
|
logError(e, 'Failed to get File');
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import { Collection } from 'services/collectionService';
|
import { Collection } from 'services/collectionService';
|
||||||
import { File } from 'services/fileService';
|
import { File, FILE_TYPE } from 'services/fileService';
|
||||||
|
import { decodeMotionPhoto } from 'services/motionPhotoService';
|
||||||
|
import { getMimeTypeFromBlob } from 'services/upload/readFileService';
|
||||||
import { runningInBrowser } from 'utils/common';
|
import { runningInBrowser } from 'utils/common';
|
||||||
import CryptoWorker from 'utils/crypto';
|
import CryptoWorker from 'utils/crypto';
|
||||||
|
|
||||||
|
@ -175,3 +177,22 @@ export function generateStreamFromArrayBuffer(data: Uint8Array) {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function convertForPreview(file: File, fileBlob: Blob) {
|
||||||
|
if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) {
|
||||||
|
const originalName = fileNameWithoutExtension(file.metadata.title);
|
||||||
|
const motionPhoto = await decodeMotionPhoto(fileBlob, originalName);
|
||||||
|
fileBlob = new Blob([motionPhoto.image]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const typeFromExtension = file.metadata.title.split('.')[-1];
|
||||||
|
const worker = await new CryptoWorker();
|
||||||
|
|
||||||
|
const mimeType =
|
||||||
|
(await getMimeTypeFromBlob(worker, fileBlob)) ?? typeFromExtension;
|
||||||
|
|
||||||
|
if (fileIsHEIC(mimeType)) {
|
||||||
|
fileBlob = await convertHEIC2JPEG(fileBlob);
|
||||||
|
}
|
||||||
|
return fileBlob;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue