basic refactoring

This commit is contained in:
Abhinav-grd 2021-08-11 21:29:59 +05:30
parent b94795e0c4
commit 4f068e283d
2 changed files with 51 additions and 43 deletions

View file

@ -1,12 +1,16 @@
import { getToken } from 'utils/common/key';
import { getFileUrl, getThumbnailUrl } from 'utils/common/apiUtil';
import CryptoWorker from 'utils/crypto';
import { fileIsHEIC, convertHEIC2JPEG } from 'utils/file';
import {
fileIsHEIC,
convertHEIC2JPEG,
fileNameWithoutExtension,
} from 'utils/file';
import HTTPService from './HTTPService';
import { File } from './fileService';
import { logError } from 'utils/sentry';
import { FILE_TYPE } from 'pages/gallery';
import { downloadAndDecodeMotionPhoto } from './motionPhotoService';
import { decodeMotionPhoto } from './motionPhotoService';
class DownloadManager {
private fileDownloads = new Map<string, string>();
@ -60,26 +64,27 @@ class DownloadManager {
getFile = async (file: File, forPreview = false) => {
try {
if (!this.fileDownloads.get(`${file.id}_${forPreview}`)) {
let fileBlob: Blob;
// unzip motion photo and return fileBlob of the image for preview
if (
forPreview &&
file.metadata.fileType === FILE_TYPE.LIVE_PHOTO
) {
const motionPhoto = await downloadAndDecodeMotionPhoto(
file,
);
fileBlob = await new Response(
await motionPhoto.imageBlob,
).blob();
} else {
const fileStream = await this.downloadFile(file);
fileBlob = await new Response(fileStream).blob();
}
const fileStream = await this.downloadFile(file);
let fileBlob = await new Response(fileStream).blob();
if (forPreview) {
if (fileIsHEIC(file.metadata.title)) {
fileBlob = await convertHEIC2JPEG(fileBlob);
}
if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) {
const originalName = fileNameWithoutExtension(
file.metadata.title,
);
const motionPhoto = await decodeMotionPhoto(
fileBlob,
originalName,
);
fileBlob = await new Response(
motionPhoto.imageBlob,
).blob();
}
}
this.fileDownloads.set(
`${file.id}_${forPreview}`,

View file

@ -1,31 +1,34 @@
import downloadManager from "./downloadManager"
import { File } from './fileService';
import JSZip from 'jszip';
import { fileExtensionWithDot, fileNameWithoutExtension } from "utils/file";
import { fileExtensionWithDot } from 'utils/file';
class MotionPhoto {
imageBlob: Promise<Uint8Array>
videoBlob: Promise<Uint8Array>
imageNameTitle: String
videoNameTitle: String
imageBlob: Uint8Array;
videoBlob: Uint8Array;
imageNameTitle: String;
videoNameTitle: String;
}
export const downloadAndDecodeMotionPhoto = async (file: File) => {
const fileStream = await downloadManager.downloadFile(file);
let zipBlob = await new Response(fileStream).blob();
return JSZip.loadAsync(zipBlob, { createFolders: true })
.then(function (zip) {
let instance = new MotionPhoto();
let orignalName = fileNameWithoutExtension(file.metadata.title)
Object.keys(zip.files).forEach(function (zipFilename) {
if (zipFilename.startsWith("image")) {
instance.imageNameTitle = orignalName + fileExtensionWithDot(zipFilename);
instance.imageBlob = zip.files[zipFilename].async('uint8array');
} else if (zipFilename.startsWith("video")) {
instance.videoNameTitle = orignalName + fileExtensionWithDot(zipFilename);
instance.videoBlob = zip.files[zipFilename].async('uint8array');
}
})
return instance;
});
}
export const decodeMotionPhoto = async (
zipBlob: Blob,
originalName: string,
) => {
const zip = await JSZip.loadAsync(zipBlob, { createFolders: true });
const motionPhoto = new MotionPhoto();
for (const zipFilename in zip.files) {
if (zipFilename.startsWith('image')) {
motionPhoto.imageNameTitle =
originalName + fileExtensionWithDot(zipFilename);
motionPhoto.imageBlob = await zip.files[zipFilename].async(
'uint8array',
);
} else if (zipFilename.startsWith('video')) {
motionPhoto.videoNameTitle =
originalName + fileExtensionWithDot(zipFilename);
motionPhoto.videoBlob = await zip.files[zipFilename].async(
'uint8array',
);
}
}
return motionPhoto;
};