ente/src/services/updateCreationTimeWithExif.ts

63 lines
2.4 KiB
TypeScript
Raw Normal View History

2021-11-03 10:31:47 +00:00
import { SetProgressTracker } from 'components/FixLargeThumbnail';
import CryptoWorker from 'utils/crypto';
2021-11-03 10:31:47 +00:00
import {
changeFileCreationTime,
getFileFromURL,
2021-11-03 10:31:47 +00:00
updateExistingFilePubMetadata,
} from 'utils/file';
import { logError } from 'utils/sentry';
import downloadManager from './downloadManager';
2021-11-17 07:41:33 +00:00
import { File, FILE_TYPE, updatePublicMagicMetadata } from './fileService';
import { getExifData } from './upload/exifService';
import { getFileType } from './upload/readFileService';
2021-11-03 10:31:47 +00:00
export async function updateCreationTimeWithExif(
filesToBeUpdated: File[],
setProgressTracker: SetProgressTracker
) {
let completedWithError = false;
try {
if (filesToBeUpdated.length === 0) {
return completedWithError;
}
setProgressTracker({ current: 0, total: filesToBeUpdated.length });
for (const [index, file] of filesToBeUpdated.entries()) {
try {
const fileURL = await downloadManager.getFile(file);
const fileObject = await getFileFromURL(fileURL);
const worker = await new CryptoWorker();
const fileTypeInfo = await getFileType(worker, fileObject);
2021-11-17 07:41:33 +00:00
if (file.metadata.fileType !== FILE_TYPE.IMAGE) {
continue;
}
const exifData = await getExifData(fileObject, fileTypeInfo);
if (
exifData?.creationTime &&
exifData?.creationTime !== file.metadata.creationTime
) {
2021-11-03 10:31:47 +00:00
let updatedFile = await changeFileCreationTime(
file,
exifData.creationTime
);
updatedFile = (
await updatePublicMagicMetadata([updatedFile])
)[0];
updateExistingFilePubMetadata(file, updatedFile);
}
} catch (e) {
logError(e, 'failed to updated a CreationTime With Exif');
completedWithError = true;
} finally {
2021-11-03 10:31:47 +00:00
setProgressTracker({
current: index + 1,
2021-11-03 10:31:47 +00:00
total: filesToBeUpdated.length,
});
}
}
} catch (e) {
logError(e, 'update CreationTime With Exif failed');
completedWithError = true;
}
return completedWithError;
}