diff --git a/apps/photos/src/services/upload/fileService.ts b/apps/photos/src/services/upload/fileService.ts index 38a32455e..ca3c5dc55 100644 --- a/apps/photos/src/services/upload/fileService.ts +++ b/apps/photos/src/services/upload/fileService.ts @@ -2,12 +2,12 @@ import { MULTIPART_PART_SIZE, FILE_READER_CHUNK_SIZE } from 'constants/upload'; import { FileTypeInfo, FileInMemory, - Metadata, EncryptedFile, FileWithMetadata, ParsedMetadataJSONMap, DataStream, ElectronFile, + ExtractMetadataResult, } from 'types/upload'; import { splitFilenameAndExtension } from 'utils/file'; import { logError } from 'utils/sentry'; @@ -74,13 +74,14 @@ export async function extractFileMetadata( collectionID: number, fileTypeInfo: FileTypeInfo, rawFile: File | ElectronFile -) { +): Promise { const originalName = getFileOriginalName(rawFile); const googleMetadata = parsedMetadataJSONMap.get( getMetadataJSONMapKey(collectionID, originalName) ) ?? {}; - const extractedMetadata: Metadata = await extractMetadata( + + const { metadata, publicMagicMetadata } = await extractMetadata( worker, rawFile, fileTypeInfo @@ -90,9 +91,9 @@ export async function extractFileMetadata( if (!value) { continue; } - extractedMetadata[key] = value; + metadata[key] = value; } - return extractedMetadata; + return { metadata, publicMagicMetadata }; } export async function encryptFile( diff --git a/apps/photos/src/services/upload/livePhotoService.ts b/apps/photos/src/services/upload/livePhotoService.ts index 98a21a803..fd345a345 100644 --- a/apps/photos/src/services/upload/livePhotoService.ts +++ b/apps/photos/src/services/upload/livePhotoService.ts @@ -8,6 +8,7 @@ import { FileWithCollection, LivePhotoAssets, ParsedMetadataJSONMap, + ExtractMetadataResult, } from 'types/upload'; import { CustomError } from 'utils/error'; import { getFileTypeFromExtensionForLivePhotoClustering } from 'utils/file/livePhoto'; @@ -51,12 +52,15 @@ export async function extractLivePhotoMetadata( collectionID: number, fileTypeInfo: FileTypeInfo, livePhotoAssets: LivePhotoAssets -) { +): Promise { const imageFileTypeInfo: FileTypeInfo = { fileType: FILE_TYPE.IMAGE, exactType: fileTypeInfo.imageType, }; - const imageMetadata = await extractFileMetadata( + const { + metadata: imageMetadata, + publicMagicMetadata: imagePublicMagicMetadata, + } = await extractFileMetadata( worker, parsedMetadataJSONMap, collectionID, @@ -65,12 +69,15 @@ export async function extractLivePhotoMetadata( ); const videoHash = await getFileHash(worker, livePhotoAssets.video); return { - ...imageMetadata, - title: getLivePhotoName(livePhotoAssets), - fileType: FILE_TYPE.LIVE_PHOTO, - imageHash: imageMetadata.hash, - videoHash: videoHash, - hash: undefined, + metadata: { + ...imageMetadata, + title: getLivePhotoName(livePhotoAssets), + fileType: FILE_TYPE.LIVE_PHOTO, + imageHash: imageMetadata.hash, + videoHash: videoHash, + hash: undefined, + }, + publicMagicMetadata: imagePublicMagicMetadata, }; } diff --git a/apps/photos/src/services/upload/metadataService.ts b/apps/photos/src/services/upload/metadataService.ts index e3924f981..e480745aa 100644 --- a/apps/photos/src/services/upload/metadataService.ts +++ b/apps/photos/src/services/upload/metadataService.ts @@ -8,6 +8,7 @@ import { FileTypeInfo, ParsedExtractedMetadata, ElectronFile, + ExtractMetadataResult as ExtractMetadataResult, } from 'types/upload'; import { NULL_EXTRACTED_METADATA, NULL_LOCATION } from 'constants/upload'; import { getVideoMetadata } from './videoMetadataService'; @@ -19,6 +20,7 @@ import { import { getFileHash } from './hashService'; import { Remote } from 'comlink'; import { DedicatedCryptoWorker } from 'worker/crypto.worker'; +import { FilePublicMagicMetadataProps } from 'types/magicMetadata'; interface ParsedMetadataJSONWithTitle { title: string; @@ -52,7 +54,7 @@ export async function extractMetadata( worker: Remote, receivedFile: File | ElectronFile, fileTypeInfo: FileTypeInfo -) { +): Promise { let extractedMetadata: ParsedExtractedMetadata = NULL_EXTRACTED_METADATA; if (fileTypeInfo.fileType === FILE_TYPE.IMAGE) { extractedMetadata = await getImageMetadata(receivedFile, fileTypeInfo); @@ -72,10 +74,12 @@ export async function extractMetadata( longitude: extractedMetadata.location.longitude, fileType: fileTypeInfo.fileType, hash: fileHash, + }; + const publicMagicMetadata: FilePublicMagicMetadataProps = { w: extractedMetadata.width, h: extractedMetadata.height, }; - return metadata; + return { metadata, publicMagicMetadata }; } export async function getImageMetadata( diff --git a/apps/photos/src/services/upload/uploadService.ts b/apps/photos/src/services/upload/uploadService.ts index 8d143869f..35947cb26 100644 --- a/apps/photos/src/services/upload/uploadService.ts +++ b/apps/photos/src/services/upload/uploadService.ts @@ -7,11 +7,11 @@ import { CustomError, handleUploadError } from 'utils/error'; import { BackupedFile, EncryptedFile, + ExtractMetadataResult, FileTypeInfo, FileWithCollection, FileWithMetadata, isDataStream, - Metadata, ParsedMetadataJSON, ParsedMetadataJSONMap, ProcessedFile, @@ -109,7 +109,7 @@ class UploadService { { isLivePhoto, file, livePhotoAssets }: UploadAsset, collectionID: number, fileTypeInfo: FileTypeInfo - ): Promise { + ): Promise { return isLivePhoto ? extractLivePhotoMetadata( worker, diff --git a/apps/photos/src/services/upload/uploader.ts b/apps/photos/src/services/upload/uploader.ts index 61f30e2ee..bec61cb7f 100644 --- a/apps/photos/src/services/upload/uploader.ts +++ b/apps/photos/src/services/upload/uploader.ts @@ -55,12 +55,13 @@ export default async function uploader( ); addLogLine(`extracting metadata ${fileNameSize}`); - const metadata = await UploadService.extractAssetMetadata( - worker, - uploadAsset, - collection.id, - fileTypeInfo - ); + const { metadata, publicMagicMetadata } = + await UploadService.extractAssetMetadata( + worker, + uploadAsset, + collection.id, + fileTypeInfo + ); const matchingExistingFiles = findMatchingExistingFiles( existingFiles, @@ -117,7 +118,11 @@ export default async function uploader( metadata.hasStaticThumbnail = true; } let pubMagicMetadata: FilePublicMagicMetadata; - if (uploaderName) { + if (publicMagicMetadata) { + pubMagicMetadata = await uploadService.constructPublicMagicMetadata( + publicMagicMetadata + ); + } else if (uploaderName) { pubMagicMetadata = await uploadService.constructPublicMagicMetadata( { uploaderName } ); diff --git a/apps/photos/src/types/magicMetadata/index.ts b/apps/photos/src/types/magicMetadata/index.ts index 14c5dcae9..3a1c5cdec 100644 --- a/apps/photos/src/types/magicMetadata/index.ts +++ b/apps/photos/src/types/magicMetadata/index.ts @@ -24,6 +24,8 @@ export interface FilePublicMagicMetadataProps { editedName?: string; caption?: string; uploaderName?: string; + w?: number; + h?: number; } export interface FilePublicMagicMetadata diff --git a/apps/photos/src/types/upload/index.ts b/apps/photos/src/types/upload/index.ts index 8dd225b63..f33c686f8 100644 --- a/apps/photos/src/types/upload/index.ts +++ b/apps/photos/src/types/upload/index.ts @@ -5,6 +5,7 @@ import { MetadataFileAttributes, S3FileAttributes } from 'types/file'; import { EncryptedMagicMetadata, FilePublicMagicMetadata, + FilePublicMagicMetadataProps, } from 'types/magicMetadata'; export interface DataStream { @@ -27,8 +28,6 @@ export interface Metadata { hash?: string; imageHash?: string; videoHash?: string; - w?: number; - h?: number; } export interface Location { @@ -155,3 +154,8 @@ export interface PublicUploadProps { passwordToken: string; accessedThroughSharedURL: boolean; } + +export interface ExtractMetadataResult { + metadata: Metadata; + publicMagicMetadata: FilePublicMagicMetadataProps; +}