edits time
This commit is contained in:
@@ -11,7 +11,7 @@ import { formattedDateRelative } from "ente-base/i18n-date";
|
||||
import log from "ente-base/log";
|
||||
import { downloadManager } from "ente-gallery/services/download";
|
||||
import { EnteFile } from "ente-media/file";
|
||||
import { fileDurationString } from "ente-media/file-metadata";
|
||||
import { fileCreationTime, fileDurationString } from "ente-media/file-metadata";
|
||||
import { FileType } from "ente-media/file-type";
|
||||
import {
|
||||
GAP_BTW_TILES,
|
||||
@@ -360,11 +360,11 @@ export const FileList: React.FC<FileListProps> = ({
|
||||
if (
|
||||
!currentDate ||
|
||||
!isSameDay(
|
||||
new Date(item.file.metadata.creationTime / 1000),
|
||||
new Date(fileCreationTime(item.file) / 1000),
|
||||
new Date(currentDate),
|
||||
)
|
||||
) {
|
||||
currentDate = item.file.metadata.creationTime / 1000;
|
||||
currentDate = fileCreationTime(item.file) / 1000;
|
||||
|
||||
timeStampList.push({
|
||||
tag: "date",
|
||||
|
||||
@@ -7,7 +7,7 @@ import {
|
||||
} from "ente-gallery/components/viewer/FileViewer";
|
||||
import type { Collection } from "ente-media/collection";
|
||||
import { EnteFile } from "ente-media/file";
|
||||
import { fileFileName } from "ente-media/file-metadata";
|
||||
import { fileCreationTime, fileFileName } from "ente-media/file-metadata";
|
||||
import { moveToTrash } from "ente-new/photos/services/collection";
|
||||
import { PseudoCollectionID } from "ente-new/photos/services/collection-summary";
|
||||
import { t } from "i18next";
|
||||
@@ -227,8 +227,8 @@ const Container = styled("div")`
|
||||
/**
|
||||
* See: [Note: Timeline date string]
|
||||
*/
|
||||
const fileTimelineDateString = (item: EnteFile) => {
|
||||
const date = new Date(item.metadata.creationTime / 1000);
|
||||
const fileTimelineDateString = (file: EnteFile) => {
|
||||
const date = new Date(fileCreationTime(file) / 1000);
|
||||
return isSameDay(date, new Date())
|
||||
? t("today")
|
||||
: isSameDay(date, new Date(Date.now() - 24 * 60 * 60 * 1000))
|
||||
|
||||
@@ -34,7 +34,10 @@ import {
|
||||
type EnteFile,
|
||||
type RemoteEnteFile,
|
||||
} from "ente-media/file";
|
||||
import type { ParsedMetadata } from "ente-media/file-metadata";
|
||||
import {
|
||||
fileCreationTime,
|
||||
type ParsedMetadata,
|
||||
} from "ente-media/file-metadata";
|
||||
import { FileType } from "ente-media/file-type";
|
||||
import { potentialFileTypeFromExtension } from "ente-media/live-photo";
|
||||
import { getLocalFiles } from "ente-new/photos/services/files";
|
||||
@@ -413,7 +416,7 @@ class UploadManager {
|
||||
collection: Collection,
|
||||
sourceEnteFile: EnteFile,
|
||||
) {
|
||||
const timestamp = sourceEnteFile.metadata.creationTime;
|
||||
const timestamp = fileCreationTime(sourceEnteFile);
|
||||
const dateTime = sourceEnteFile.pubMagicMetadata?.data.dateTime;
|
||||
const offset = sourceEnteFile.pubMagicMetadata?.data.offsetTime;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import {
|
||||
matchJSONMetadata,
|
||||
metadataJSONMapKeyForJSON,
|
||||
} from "ente-gallery/services/upload/metadata-json";
|
||||
import { fileFileName } from "ente-media/file-metadata";
|
||||
import { fileCreationTime, fileFileName } from "ente-media/file-metadata";
|
||||
import { FileType } from "ente-media/file-type";
|
||||
import { getLocalCollections } from "ente-new/photos/services/collections";
|
||||
import { groupFilesByCollectionID } from "ente-new/photos/services/files";
|
||||
@@ -303,11 +303,11 @@ async function exifDataParsingCheck(expectedState) {
|
||||
}
|
||||
if (
|
||||
exifValues["creation_time"] &&
|
||||
exifValues["creation_time"] !== matchingFile.metadata.creationTime
|
||||
exifValues["creation_time"] !== fileCreationTime(matchingFile)
|
||||
) {
|
||||
throw Error(`exifDataParsingCheck failed ❌ ,
|
||||
for ${fileName}
|
||||
expected: ${exifValues["creation_time"]} got: ${matchingFile.metadata.creationTime}`);
|
||||
expected: ${exifValues["creation_time"]} got: ${fileCreationTime(matchingFile)}`);
|
||||
}
|
||||
if (
|
||||
exifValues["location"] &&
|
||||
@@ -369,11 +369,11 @@ async function googleMetadataReadingCheck(expectedState) {
|
||||
}
|
||||
if (
|
||||
metadata["creation_time"] &&
|
||||
metadata["creation_time"] !== matchingFile.metadata.creationTime
|
||||
metadata["creation_time"] !== fileCreationTime(matchingFile)
|
||||
) {
|
||||
throw Error(`googleMetadataJSON reading check failed ❌ ,
|
||||
for ${fileName}
|
||||
expected: ${metadata["creation_time"]} got: ${matchingFile.metadata.creationTime}`);
|
||||
expected: ${metadata["creation_time"]} got: ${fileCreationTime(matchingFile)}`);
|
||||
}
|
||||
if (
|
||||
metadata["location"] &&
|
||||
|
||||
@@ -459,6 +459,17 @@ export const isArchivedFile = (file: EnteFile) =>
|
||||
export const fileFileName = (file: EnteFile) =>
|
||||
file.pubMagicMetadata?.data.editedName ?? file.metadata.title;
|
||||
|
||||
/**
|
||||
* Return the file's creation timestamp (epoch microseconds).
|
||||
*
|
||||
* This function handles files with edited dates.
|
||||
*
|
||||
* While sometimes the epoch timestamp is the correct value to use, it is also
|
||||
* possible that {@link fileCreationPhotoDate} might be more appropriate.
|
||||
*/
|
||||
export const fileCreationTime = (file: EnteFile) =>
|
||||
file.pubMagicMetadata?.data.editedTime ?? file.metadata.creationTime;
|
||||
|
||||
/**
|
||||
* Return the file's creation date as a Date in the hypothetical "timezone of
|
||||
* the photo".
|
||||
|
||||
@@ -470,8 +470,9 @@ const mergeMetadata1 = (file: EnteFile): EnteFile => {
|
||||
const mutableMetadata = file.pubMagicMetadata?.data;
|
||||
if (mutableMetadata) {
|
||||
const { editedTime, editedName, lat, long } = mutableMetadata;
|
||||
// Not needed, fileCreationTime is used instead.
|
||||
if (editedTime) file.metadata.creationTime = editedTime;
|
||||
// Not needed, use fileFileName.
|
||||
// Not needed, fileFileName is used instead.
|
||||
if (editedName) file.metadata.title = editedName;
|
||||
// Use (lat, long) only if both are present and nonzero.
|
||||
if (lat && long) {
|
||||
@@ -480,11 +481,11 @@ const mergeMetadata1 = (file: EnteFile): EnteFile => {
|
||||
}
|
||||
}
|
||||
|
||||
// Moved to transformDecryptedMetadataJSON.
|
||||
// Moved to transformDecryptedMetadataJSON. Not needed.
|
||||
if (!file.metadata.modificationTime)
|
||||
file.metadata.modificationTime = file.metadata.creationTime;
|
||||
|
||||
// Moved to transformDecryptedMetadataJSON.
|
||||
// Moved to transformDecryptedMetadataJSON. Not needed.
|
||||
if (!file.metadata.fileType && file.id < 100000000)
|
||||
file.metadata.fileType = FileType.image;
|
||||
|
||||
|
||||
@@ -16,7 +16,11 @@ import { downloadManager } from "ente-gallery/services/download";
|
||||
import { writeStream } from "ente-gallery/utils/native-stream";
|
||||
import type { Collection } from "ente-media/collection";
|
||||
import { fileLogID, mergeMetadata, type EnteFile } from "ente-media/file";
|
||||
import { fileFileName, fileLocation } from "ente-media/file-metadata";
|
||||
import {
|
||||
fileCreationTime,
|
||||
fileFileName,
|
||||
fileLocation,
|
||||
} from "ente-media/file-metadata";
|
||||
import { FileType } from "ente-media/file-type";
|
||||
import { decodeLivePhoto } from "ente-media/live-photo";
|
||||
import {
|
||||
@@ -1447,13 +1451,8 @@ const getGoogleLikeMetadataFile = (
|
||||
dateTimeFormatter: Intl.DateTimeFormat,
|
||||
) => {
|
||||
const metadata = file.metadata;
|
||||
const publicMagicMetadata = file.pubMagicMetadata?.data;
|
||||
const creationTime = Math.floor(
|
||||
(publicMagicMetadata?.editedTime ?? metadata.creationTime) / 1e6,
|
||||
);
|
||||
const modificationTime = Math.floor(
|
||||
(metadata.modificationTime ?? metadata.creationTime) / 1e6,
|
||||
);
|
||||
const creationTime = Math.floor(fileCreationTime(file) / 1e6);
|
||||
const modificationTime = Math.floor(metadata.modificationTime / 1e6);
|
||||
const result: Record<string, unknown> = {
|
||||
title: fileExportName,
|
||||
creationTime: {
|
||||
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
type EnteFile,
|
||||
type RemoteEnteFile,
|
||||
} from "ente-media/file";
|
||||
import { metadataHash } from "ente-media/file-metadata";
|
||||
import { fileCreationTime, metadataHash } from "ente-media/file-metadata";
|
||||
import { type Trash } from "ente-new/photos/services/trash";
|
||||
import HTTPService from "ente-shared/network/HTTPService";
|
||||
import localForage from "ente-shared/storage/localForage";
|
||||
@@ -170,13 +170,12 @@ export const sortFiles = (files: EnteFile[], sortAsc = false) => {
|
||||
// modification.
|
||||
const factor = sortAsc ? -1 : 1;
|
||||
return files.sort((a, b) => {
|
||||
if (a.metadata.creationTime === b.metadata.creationTime) {
|
||||
return (
|
||||
factor *
|
||||
(b.metadata.modificationTime - a.metadata.modificationTime)
|
||||
);
|
||||
}
|
||||
return factor * (b.metadata.creationTime - a.metadata.creationTime);
|
||||
const at = fileCreationTime(a);
|
||||
const bt = fileCreationTime(b);
|
||||
return at == bt
|
||||
? factor *
|
||||
(b.metadata.modificationTime - a.metadata.modificationTime)
|
||||
: factor * (bt - at);
|
||||
});
|
||||
};
|
||||
|
||||
@@ -269,12 +268,11 @@ export const getLocalTrashFileIDs = () =>
|
||||
const sortTrashFiles = (files: TrashedEnteFile[]) => {
|
||||
return files.sort((a, b) => {
|
||||
if (a.deleteBy === b.deleteBy) {
|
||||
if (a.metadata.creationTime === b.metadata.creationTime) {
|
||||
return (
|
||||
b.metadata.modificationTime - a.metadata.modificationTime
|
||||
);
|
||||
}
|
||||
return b.metadata.creationTime - a.metadata.creationTime;
|
||||
const at = fileCreationTime(a);
|
||||
const bt = fileCreationTime(b);
|
||||
return at == bt
|
||||
? b.metadata.modificationTime - a.metadata.modificationTime
|
||||
: bt - at;
|
||||
}
|
||||
return (a.deleteBy ?? 0) - (b.deleteBy ?? 0);
|
||||
});
|
||||
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
type FaceIndex,
|
||||
} from "./face";
|
||||
import { dotProduct } from "./math";
|
||||
import { fileCreationTime } from "ente-media/file-metadata";
|
||||
|
||||
/**
|
||||
* A face cluster is an set of faces, and a nanoid to uniquely identify it.
|
||||
@@ -229,7 +230,7 @@ const sortFacesNewestOnesFirst = (
|
||||
assertionFailed(`Did not find a local file for faceID ${faceID}`);
|
||||
return 0;
|
||||
}
|
||||
return file.metadata.creationTime;
|
||||
return fileCreationTime(file);
|
||||
};
|
||||
|
||||
return faces.sort((a, b) => sortTimeForFace(b) - sortTimeForFace(a));
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { assertionFailed } from "ente-base/assert";
|
||||
import log from "ente-base/log";
|
||||
import type { EnteFile } from "ente-media/file";
|
||||
import { fileCreationTime } from "ente-media/file-metadata";
|
||||
import { randomSample } from "ente-utils/array";
|
||||
import { savedNormalFiles } from "../photos-fdb";
|
||||
import {
|
||||
@@ -245,8 +246,8 @@ export const reconstructPeopleState = async (): Promise<PeopleState> => {
|
||||
.map((faceID) => personFaceByID.get(faceID))
|
||||
.filter((pf) => !!pf)
|
||||
.sort((a, b) => {
|
||||
const at = a.file.metadata.creationTime;
|
||||
const bt = b.file.metadata.creationTime;
|
||||
const at = fileCreationTime(a.file);
|
||||
const bt = fileCreationTime(b.file);
|
||||
return bt == at ? b.score - a.score : bt - at;
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user