From f0b8e3b4af439a8a348d18b681d76a9ca57dfc35 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 3 Apr 2025 18:55:55 +0530 Subject: [PATCH] Better fallback --- .../photos/src/services/upload/upload-service.ts | 12 +++++++++--- web/apps/photos/src/services/upload/uploadManager.ts | 5 ++++- web/packages/media/file-metadata.ts | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/services/upload/upload-service.ts b/web/apps/photos/src/services/upload/upload-service.ts index 0086fc478e..904e4bd17c 100644 --- a/web/apps/photos/src/services/upload/upload-service.ts +++ b/web/apps/photos/src/services/upload/upload-service.ts @@ -236,6 +236,10 @@ export const uploadItemFileName = (uploadItem: UploadItem) => { /* -- Various intermediate type used during upload -- */ +export type ExternalParsedMetadata = ParsedMetadata & { + creationTime?: number | undefined; +}; + export interface UploadAsset { /** `true` if this is a live photo. */ isLivePhoto?: boolean; @@ -254,7 +258,7 @@ export interface UploadAsset { * * This will not be present for live photos. */ - externalParsedMetadata?: ParsedMetadata; + externalParsedMetadata?: ExternalParsedMetadata; } interface ThumbnailedFile { @@ -973,7 +977,7 @@ const extractLivePhotoMetadata = async ( const extractImageOrVideoMetadata = async ( uploadItem: UploadItem, - externalParsedMetadata: ParsedMetadata | undefined, + externalParsedMetadata: ExternalParsedMetadata | undefined, fileTypeInfo: FileTypeInfo, lastModifiedMs: number, collectionID: number, @@ -983,7 +987,7 @@ const extractImageOrVideoMetadata = async ( const fileName = uploadItemFileName(uploadItem); const { fileType } = fileTypeInfo; - let parsedMetadata: ParsedMetadata | undefined; + let parsedMetadata: (ParsedMetadata & ExternalParsedMetadata) | undefined; if (fileType == FileType.image) { parsedMetadata = await tryExtractImageMetadata( uploadItem, @@ -1026,6 +1030,8 @@ const extractImageOrVideoMetadata = async ( creationTime = timestamp; publicMagicMetadata.dateTime = dateTime; if (offset) publicMagicMetadata.offsetTime = offset; + } else if (parsedMetadata.creationTime) { + creationTime = parsedMetadata.creationTime; } else { creationTime = tryParseEpochMicrosecondsFromFileName(fileName) ?? modificationTime; diff --git a/web/apps/photos/src/services/upload/uploadManager.ts b/web/apps/photos/src/services/upload/uploadManager.ts index 955ed740b9..b36ef2a612 100644 --- a/web/apps/photos/src/services/upload/uploadManager.ts +++ b/web/apps/photos/src/services/upload/uploadManager.ts @@ -472,11 +472,14 @@ class UploadManager { ? { timestamp, dateTime, offset } : undefined; + // Fallback to the timestamp if a creationDate could not be constructed. + const creationTime = creationDate ? undefined : timestamp; + const item = { uploadItem: file, localID: 1, collectionID: collection.id, - externalParsedMetadata: { creationDate }, + externalParsedMetadata: { creationDate, creationTime }, }; return this.uploadItems([item], [collection]); diff --git a/web/packages/media/file-metadata.ts b/web/packages/media/file-metadata.ts index 9590541ccd..cc2ce171c8 100644 --- a/web/packages/media/file-metadata.ts +++ b/web/packages/media/file-metadata.ts @@ -778,7 +778,7 @@ export interface ParsedMetadata { * Logically this is a date in local timezone of the place where the photo * was taken. See: [Note: Photos are always in local date/time]. */ - creationDate?: ParsedMetadataDate; + creationDate?: ParsedMetadataDate | undefined; /** The GPS coordinates where the photo was taken. */ location?: Location; /**