diff --git a/web/packages/new/photos/services/ffmpeg/index.ts b/web/packages/new/photos/services/ffmpeg/index.ts index 3ce88677a3..134ee86797 100644 --- a/web/packages/new/photos/services/ffmpeg/index.ts +++ b/web/packages/new/photos/services/ffmpeg/index.ts @@ -178,25 +178,19 @@ const parseFFmpegExtractedMetadata = (ffmpegOutput: Uint8Array) => { const kv = new Map(kvPairs); + const result: ParsedMetadata = {}; + const location = parseMetadataLocation( kv.get("com.apple.quicktime.location.ISO6709") ?? kv.get("location"), ); + if (location) result.location = location; - return { location }; - // const creationTime = parseCreationTime( - // kv.get(MetadataTags.APPLE_CREATION_DATE) ?? - // kv.get(MetadataTags.CREATION_TIME), - // ); - // const parsedMetadata: ParsedExtractedMetadata = { - // creationTime, - // location: { - // latitude: location.latitude, - // longitude: location.longitude, - // }, - // width: null, - // height: null, - // }; - // return parsedMetadata; + const creationDate = parseMetadataCreationDate( + kv.get("com.apple.quicktime.creationdate") ?? kv.get("creation_time"), + ); + if (creationDate) result.creationDate = creationDate; + + return result; }; /** @@ -223,6 +217,33 @@ const parseMetadataLocation = (s: string | undefined) => { return { latitude, longitude }; }; +/** + * Parse a date/time string found in the FFmpeg metadata attributes. + * + * This is meant to parse either the "com.apple.quicktime.creationdate" + * (preferable) or the "creation_time" key (fallback). + * + * Both of them are expected to be ISO 8601 date/time strings, but in particular + * the quicktime.creationdate includes the time zone offset. + */ +const parseMetadataCreationDate = (s: string | undefined) => { + if (!s) return undefined; + + const m = s.match(/(\+|-)\d+\.*\d+/g); + if (!m) { + log.warn(`Ignoring unparseable location string "${s}"`); + return undefined; + } + + const [latitude, longitude] = m.map(parseFloat); + if (!latitude || !longitude) { + log.warn(`Ignoring unparseable location string "${s}"`); + return undefined; + } + + return { latitude, longitude }; +}; + const parseCreationTime = (creationTime: string | undefined) => { let dateTime = null; if (creationTime) {