diff --git a/web/apps/cast/src/services/render.ts b/web/apps/cast/src/services/render.ts index 21c9925a03..6f1a006178 100644 --- a/web/apps/cast/src/services/render.ts +++ b/web/apps/cast/src/services/render.ts @@ -9,16 +9,16 @@ import { sharedCryptoWorker } from "@/base/crypto"; import { nameAndExtension } from "@/base/file"; import log from "@/base/log"; import { apiURL, customAPIOrigin } from "@/base/origins"; -import { FileType } from "@/media/file-type"; -import { isHEICExtension, needsJPEGConversion } from "@/media/formats"; -import { heicToJPEG } from "@/media/heic-convert"; -import { decodeLivePhoto } from "@/media/live-photo"; import type { EncryptedEnteFile, EnteFile, FileMagicMetadata, FilePublicMagicMetadata, -} from "@/new/photos/types/file"; +} from "@/media/file"; +import { FileType } from "@/media/file-type"; +import { isHEICExtension, needsJPEGConversion } from "@/media/formats"; +import { heicToJPEG } from "@/media/heic-convert"; +import { decodeLivePhoto } from "@/media/live-photo"; import { mergeMetadata1 } from "@/new/photos/utils/file"; import { shuffled } from "@/utils/array"; import { ensure } from "@/utils/ensure"; diff --git a/web/apps/photos/src/components/ExportFinished.tsx b/web/apps/photos/src/components/ExportFinished.tsx index 73ed119200..206825c3e0 100644 --- a/web/apps/photos/src/components/ExportFinished.tsx +++ b/web/apps/photos/src/components/ExportFinished.tsx @@ -1,4 +1,4 @@ -import { EnteFile } from "@/new/photos/types/file"; +import { EnteFile } from "@/media/file"; import { SpaceBetweenFlex } from "@ente/shared/components/Container"; import { formatDateTime } from "@ente/shared/time/format"; import { diff --git a/web/apps/photos/src/components/ExportModal.tsx b/web/apps/photos/src/components/ExportModal.tsx index b8cf25b56b..0662f52878 100644 --- a/web/apps/photos/src/components/ExportModal.tsx +++ b/web/apps/photos/src/components/ExportModal.tsx @@ -1,7 +1,7 @@ import { EnteSwitch } from "@/base/components/EnteSwitch"; import log from "@/base/log"; +import { EnteFile } from "@/media/file"; import { AppContext } from "@/new/photos/types/context"; -import { EnteFile } from "@/new/photos/types/file"; import ChangeDirectoryOption from "@ente/shared/components/ChangeDirectoryOption"; import { SpaceBetweenFlex, diff --git a/web/apps/photos/src/components/ExportPendingList.tsx b/web/apps/photos/src/components/ExportPendingList.tsx index 087f31d3d0..69ce3011d9 100644 --- a/web/apps/photos/src/components/ExportPendingList.tsx +++ b/web/apps/photos/src/components/ExportPendingList.tsx @@ -1,7 +1,7 @@ import { TitledMiniDialog } from "@/base/components/MiniDialog"; import { FocusVisibleButton } from "@/base/components/mui/FocusVisibleButton"; +import { EnteFile } from "@/media/file"; import { ItemCard, PreviewItemTile } from "@/new/photos/components/Tiles"; -import { EnteFile } from "@/new/photos/types/file"; import { FlexWrapper } from "@ente/shared/components/Container"; import { Box, styled } from "@mui/material"; import ItemList from "components/ItemList"; diff --git a/web/apps/photos/src/components/FixCreationTime.tsx b/web/apps/photos/src/components/FixCreationTime.tsx index f92ec8491a..1b84463e06 100644 --- a/web/apps/photos/src/components/FixCreationTime.tsx +++ b/web/apps/photos/src/components/FixCreationTime.tsx @@ -1,4 +1,5 @@ import log from "@/base/log"; +import { EnteFile } from "@/media/file"; import { decryptPublicMagicMetadata, fileCreationPhotoDate, @@ -9,7 +10,6 @@ import { FileType } from "@/media/file-type"; import { PhotoDateTimePicker } from "@/new/photos/components/PhotoDateTimePicker"; import downloadManager from "@/new/photos/services/download"; import { extractExifDates } from "@/new/photos/services/exif"; -import { EnteFile } from "@/new/photos/types/file"; import { fileLogID } from "@/new/photos/utils/file"; import { ensure } from "@/utils/ensure"; import DialogBox from "@ente/shared/components/DialogBox/"; diff --git a/web/apps/photos/src/components/PhotoFrame.tsx b/web/apps/photos/src/components/PhotoFrame.tsx index 15365d7c26..fc5723d1e5 100644 --- a/web/apps/photos/src/components/PhotoFrame.tsx +++ b/web/apps/photos/src/components/PhotoFrame.tsx @@ -1,9 +1,9 @@ import log from "@/base/log"; +import type { LivePhotoSourceURL, SourceURLs } from "@/media/file"; +import { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import type { GalleryBarMode } from "@/new/photos/components/gallery/BarImpl"; import DownloadManager from "@/new/photos/services/download"; -import type { LivePhotoSourceURL, SourceURLs } from "@/new/photos/types/file"; -import { EnteFile } from "@/new/photos/types/file"; import { PHOTOS_PAGES } from "@ente/shared/constants/pages"; import { CustomError } from "@ente/shared/error"; import useMemoSingleThreaded from "@ente/shared/hooks/useMemoSingleThreaded"; diff --git a/web/apps/photos/src/components/PhotoList/dedupe.tsx b/web/apps/photos/src/components/PhotoList/dedupe.tsx index ea46c46f4a..6cc550f43e 100644 --- a/web/apps/photos/src/components/PhotoList/dedupe.tsx +++ b/web/apps/photos/src/components/PhotoList/dedupe.tsx @@ -1,10 +1,10 @@ +import { EnteFile } from "@/media/file"; import { GAP_BTW_TILES, IMAGE_CONTAINER_MAX_HEIGHT, IMAGE_CONTAINER_MAX_WIDTH, MIN_COLUMNS, } from "@/new/photos/components/PhotoList"; -import { EnteFile } from "@/new/photos/types/file"; import { formattedByteSize } from "@/new/photos/utils/units"; import { FlexWrapper } from "@ente/shared/components/Container"; import { Box, styled } from "@mui/material"; diff --git a/web/apps/photos/src/components/PhotoList/index.tsx b/web/apps/photos/src/components/PhotoList/index.tsx index f40aa7887d..cdb55fa85c 100644 --- a/web/apps/photos/src/components/PhotoList/index.tsx +++ b/web/apps/photos/src/components/PhotoList/index.tsx @@ -1,4 +1,4 @@ -import { EnteFile } from "@/new/photos/types/file"; +import { EnteFile } from "@/media/file"; import { formattedByteSize } from "@/new/photos/utils/units"; import { FlexWrapper } from "@ente/shared/components/Container"; import { formatDate } from "@ente/shared/time/format"; diff --git a/web/apps/photos/src/components/PhotoViewer/FileInfo/RenderCaption.tsx b/web/apps/photos/src/components/PhotoViewer/FileInfo/RenderCaption.tsx index afad6267db..dd7080f7b1 100644 --- a/web/apps/photos/src/components/PhotoViewer/FileInfo/RenderCaption.tsx +++ b/web/apps/photos/src/components/PhotoViewer/FileInfo/RenderCaption.tsx @@ -1,5 +1,5 @@ import log from "@/base/log"; -import { EnteFile } from "@/new/photos/types/file"; +import { EnteFile } from "@/media/file"; import { FlexWrapper } from "@ente/shared/components/Container"; import Close from "@mui/icons-material/Close"; import Done from "@mui/icons-material/Done"; diff --git a/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx b/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx index b118b813a0..b1bacc854b 100644 --- a/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx @@ -7,6 +7,7 @@ import { useModalVisibility } from "@/base/components/utils/modal"; import { nameAndExtension } from "@/base/file"; import log from "@/base/log"; import type { Location } from "@/base/types"; +import { EnteFile } from "@/media/file"; import type { ParsedMetadata } from "@/media/file-metadata"; import { fileCreationPhotoDate, @@ -29,7 +30,6 @@ import { type AnnotatedFaceID, } from "@/new/photos/services/ml"; import { AppContext } from "@/new/photos/types/context"; -import { EnteFile } from "@/new/photos/types/file"; import { formattedByteSize } from "@/new/photos/utils/units"; import CopyButton from "@ente/shared/components/CodeBlock/CopyButton"; import { FlexWrapper } from "@ente/shared/components/Container"; diff --git a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx index 766e8b0550..ea265f4b33 100644 --- a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/index.tsx @@ -7,10 +7,10 @@ import { import type { MiniDialogAttributes } from "@/base/components/MiniDialog"; import { nameAndExtension } from "@/base/file"; import log from "@/base/log"; +import { EnteFile } from "@/media/file"; import { photosDialogZIndex } from "@/new/photos/components/z-index"; import downloadManager from "@/new/photos/services/download"; import { AppContext } from "@/new/photos/types/context"; -import { EnteFile } from "@/new/photos/types/file"; import { downloadAndRevokeObjectURL } from "@/new/photos/utils/web"; import { ensure } from "@/utils/ensure"; import { diff --git a/web/apps/photos/src/components/PhotoViewer/index.tsx b/web/apps/photos/src/components/PhotoViewer/index.tsx index 94063e118a..3b23751f36 100644 --- a/web/apps/photos/src/components/PhotoViewer/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/index.tsx @@ -2,13 +2,13 @@ import { isDesktop } from "@/base/app"; import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import { lowercaseExtension } from "@/base/file"; import log from "@/base/log"; +import type { LoadedLivePhotoSourceURL } from "@/media/file"; +import { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import { isHEICExtension, needsJPEGConversion } from "@/media/formats"; import downloadManager from "@/new/photos/services/download"; import { extractRawExif, parseExif } from "@/new/photos/services/exif"; import { AppContext } from "@/new/photos/types/context"; -import type { LoadedLivePhotoSourceURL } from "@/new/photos/types/file"; -import { EnteFile } from "@/new/photos/types/file"; import { fileLogID } from "@/new/photos/utils/file"; import { FlexWrapper } from "@ente/shared/components/Container"; import AlbumOutlined from "@mui/icons-material/AlbumOutlined"; diff --git a/web/apps/photos/src/components/pages/gallery/Avatar.tsx b/web/apps/photos/src/components/pages/gallery/Avatar.tsx index 5d7d5ea8fc..aa6772d9f6 100644 --- a/web/apps/photos/src/components/pages/gallery/Avatar.tsx +++ b/web/apps/photos/src/components/pages/gallery/Avatar.tsx @@ -1,5 +1,5 @@ import log from "@/base/log"; -import { EnteFile } from "@/new/photos/types/file"; +import { EnteFile } from "@/media/file"; import { styled, useTheme } from "@mui/material"; import { GalleryContext } from "pages/gallery"; import React, { useContext, useLayoutEffect, useState } from "react"; diff --git a/web/apps/photos/src/components/pages/gallery/PreviewCard.tsx b/web/apps/photos/src/components/pages/gallery/PreviewCard.tsx index f339daaf5c..4ac19e899b 100644 --- a/web/apps/photos/src/components/pages/gallery/PreviewCard.tsx +++ b/web/apps/photos/src/components/pages/gallery/PreviewCard.tsx @@ -1,4 +1,5 @@ import log from "@/base/log"; +import { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import { GAP_BTW_TILES, @@ -9,7 +10,6 @@ import { StaticThumbnail, } from "@/new/photos/components/PlaceholderThumbnails"; import DownloadManager from "@/new/photos/services/download"; -import { EnteFile } from "@/new/photos/types/file"; import { Overlay } from "@ente/shared/components/Container"; import { CustomError } from "@ente/shared/error"; import useLongPress from "@ente/shared/hooks/useLongPress"; diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index a5a99e0bb6..9624d2b385 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -5,6 +5,7 @@ import { useModalVisibility } from "@/base/components/utils/modal"; import { useIsSmallWidth } from "@/base/hooks"; import log from "@/base/log"; import type { Collection } from "@/media/collection"; +import { EnteFile } from "@/media/file"; import { CollectionSelector, type CollectionSelectorAttributes, @@ -37,7 +38,6 @@ import { } from "@/new/photos/services/search"; import type { SearchOption } from "@/new/photos/services/search/types"; import { AppContext } from "@/new/photos/types/context"; -import { EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; import { ensure } from "@/utils/ensure"; import { diff --git a/web/apps/photos/src/pages/shared-albums.tsx b/web/apps/photos/src/pages/shared-albums.tsx index c7e567419a..ec79da107c 100644 --- a/web/apps/photos/src/pages/shared-albums.tsx +++ b/web/apps/photos/src/pages/shared-albums.tsx @@ -5,6 +5,7 @@ import { sharedCryptoWorker } from "@/base/crypto"; import { useIsSmallWidth, useIsTouchscreen } from "@/base/hooks"; import log from "@/base/log"; import type { Collection } from "@/media/collection"; +import { EnteFile } from "@/media/file"; import { GalleryItemsHeaderAdapter, GalleryItemsSummary, @@ -13,7 +14,6 @@ import { SpaceBetweenFlex } from "@/new/photos/components/mui"; import downloadManager from "@/new/photos/services/download"; import { sortFiles } from "@/new/photos/services/files"; import { AppContext } from "@/new/photos/types/context"; -import { EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; import { CenteredFlex, diff --git a/web/apps/photos/src/services/collectionService.ts b/web/apps/photos/src/services/collectionService.ts index fa3f4959e5..40576bc8aa 100644 --- a/web/apps/photos/src/services/collectionService.ts +++ b/web/apps/photos/src/services/collectionService.ts @@ -19,6 +19,7 @@ import { SUB_TYPE, UpdatePublicURL, } from "@/media/collection"; +import { EncryptedMagicMetadata, EnteFile } from "@/media/file"; import { ItemVisibility } from "@/media/file-metadata"; import type { CollectionSummaries, @@ -30,7 +31,6 @@ import { CollectionsSortBy, } from "@/new/photos/services/collection/ui"; import { getLocalFiles, sortFiles } from "@/new/photos/services/files"; -import { EncryptedMagicMetadata, EnteFile } from "@/new/photos/types/file"; import { batch } from "@/utils/array"; import { CustomError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; diff --git a/web/apps/photos/src/services/deduplicationService.ts b/web/apps/photos/src/services/deduplicationService.ts index 3fecc6c018..0a2c091fa3 100644 --- a/web/apps/photos/src/services/deduplicationService.ts +++ b/web/apps/photos/src/services/deduplicationService.ts @@ -1,9 +1,8 @@ import log from "@/base/log"; import { apiURL } from "@/base/origins"; -import { hasFileHash } from "@/media/file"; +import { EnteFile, hasFileHash } from "@/media/file"; import type { Metadata } from "@/media/file-metadata"; import { FileType } from "@/media/file-type"; -import { EnteFile } from "@/new/photos/types/file"; import HTTPService from "@ente/shared/network/HTTPService"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; diff --git a/web/apps/photos/src/services/export/index.ts b/web/apps/photos/src/services/export/index.ts index 7d9f09555c..a52a4e54c4 100644 --- a/web/apps/photos/src/services/export/index.ts +++ b/web/apps/photos/src/services/export/index.ts @@ -1,6 +1,7 @@ import { ensureElectron } from "@/base/electron"; import log from "@/base/log"; import type { Collection } from "@/media/collection"; +import { EnteFile } from "@/media/file"; import { fileCreationPhotoDate, fileLocation, @@ -15,7 +16,6 @@ import { exportTrashDirectoryName, } from "@/new/photos/services/export"; import { getAllLocalFiles } from "@/new/photos/services/files"; -import { EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; import { safeDirectoryName, safeFileName } from "@/new/photos/utils/native-fs"; import { writeStream } from "@/new/photos/utils/native-stream"; diff --git a/web/apps/photos/src/services/export/migration.ts b/web/apps/photos/src/services/export/migration.ts index 9727bbe883..b71d3137b4 100644 --- a/web/apps/photos/src/services/export/migration.ts +++ b/web/apps/photos/src/services/export/migration.ts @@ -2,12 +2,12 @@ import { ensureElectron } from "@/base/electron"; import { nameAndExtension } from "@/base/file"; import log from "@/base/log"; import type { Collection } from "@/media/collection"; +import { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import { decodeLivePhoto } from "@/media/live-photo"; import downloadManager from "@/new/photos/services/download"; import { exportMetadataDirectoryName } from "@/new/photos/services/export"; import { getAllLocalFiles } from "@/new/photos/services/files"; -import { EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; import { safeDirectoryName, diff --git a/web/apps/photos/src/services/fileService.ts b/web/apps/photos/src/services/fileService.ts index 85ba3c5341..0a555031e5 100644 --- a/web/apps/photos/src/services/fileService.ts +++ b/web/apps/photos/src/services/fileService.ts @@ -2,20 +2,20 @@ import { encryptMetadataJSON } from "@/base/crypto"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; import type { Collection } from "@/media/collection"; -import { - clearCachedThumbnailsIfChanged, - getLocalFiles, - setLocalFiles, - sortFiles, -} from "@/new/photos/services/files"; -import type { EncryptedMagicMetadata } from "@/new/photos/types/file"; +import type { EncryptedMagicMetadata } from "@/media/file"; import { EncryptedEnteFile, EnteFile, FileWithUpdatedMagicMetadata, FileWithUpdatedPublicMagicMetadata, TrashRequest, -} from "@/new/photos/types/file"; +} from "@/media/file"; +import { + clearCachedThumbnailsIfChanged, + getLocalFiles, + setLocalFiles, + sortFiles, +} from "@/new/photos/services/files"; import { mergeMetadata } from "@/new/photos/utils/file"; import { batch } from "@/utils/array"; import HTTPService from "@ente/shared/network/HTTPService"; diff --git a/web/apps/photos/src/services/publicCollectionService.ts b/web/apps/photos/src/services/publicCollectionService.ts index ece90c8162..5a2dc5d8df 100644 --- a/web/apps/photos/src/services/publicCollectionService.ts +++ b/web/apps/photos/src/services/publicCollectionService.ts @@ -5,8 +5,8 @@ import type { Collection, CollectionPublicMagicMetadata, } from "@/media/collection"; +import { EncryptedEnteFile, EnteFile } from "@/media/file"; import { sortFiles } from "@/new/photos/services/files"; -import { EncryptedEnteFile, EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; import { CustomError, parseSharingErrorCodes } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; diff --git a/web/apps/photos/src/services/trashService.ts b/web/apps/photos/src/services/trashService.ts index fef3d4ee64..1a6beaf3a5 100644 --- a/web/apps/photos/src/services/trashService.ts +++ b/web/apps/photos/src/services/trashService.ts @@ -1,12 +1,12 @@ import log from "@/base/log"; import { apiURL } from "@/base/origins"; import type { Collection } from "@/media/collection"; +import { EncryptedTrashItem, Trash } from "@/media/file"; import { getLocalTrash, getTrashedFiles, TRASH, } from "@/new/photos/services/files"; -import { EncryptedTrashItem, Trash } from "@/new/photos/types/file"; import HTTPService from "@ente/shared/network/HTTPService"; import localForage from "@ente/shared/storage/localForage"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; diff --git a/web/apps/photos/src/services/upload/publicUploadHttpClient.ts b/web/apps/photos/src/services/upload/publicUploadHttpClient.ts index 8cc2682f29..2b7a4d480e 100644 --- a/web/apps/photos/src/services/upload/publicUploadHttpClient.ts +++ b/web/apps/photos/src/services/upload/publicUploadHttpClient.ts @@ -1,6 +1,6 @@ import log from "@/base/log"; import { apiURL } from "@/base/origins"; -import { EnteFile } from "@/new/photos/types/file"; +import { EnteFile } from "@/media/file"; import { CustomError, handleUploadError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import { MultipartUploadURLs, UploadFile, UploadURL } from "./upload-service"; diff --git a/web/apps/photos/src/services/upload/upload-service.ts b/web/apps/photos/src/services/upload/upload-service.ts index d130041c1e..f8df56ee2f 100644 --- a/web/apps/photos/src/services/upload/upload-service.ts +++ b/web/apps/photos/src/services/upload/upload-service.ts @@ -7,7 +7,16 @@ import { ensureElectron } from "@/base/electron"; import { basename, nameAndExtension } from "@/base/file"; import log from "@/base/log"; import { CustomErrorMessage } from "@/base/types/ipc"; -import { hasFileHash } from "@/media/file"; +import { + EncryptedMagicMetadata, + EnteFile, + hasFileHash, + MetadataFileAttributes, + S3FileAttributes, + type EncryptedEnteFile, + type FilePublicMagicMetadata, + type FilePublicMagicMetadataProps, +} from "@/media/file"; import type { Metadata, ParsedMetadata, @@ -22,15 +31,6 @@ import { RANDOM_PERCENTAGE_PROGRESS_FOR_PUT, UPLOAD_RESULT, } from "@/new/photos/services/upload/types"; -import { - EncryptedMagicMetadata, - EnteFile, - MetadataFileAttributes, - S3FileAttributes, - type EncryptedEnteFile, - type FilePublicMagicMetadata, - type FilePublicMagicMetadataProps, -} from "@/new/photos/types/file"; import { detectFileTypeInfoFromChunk } from "@/new/photos/utils/detect-type"; import { readStream } from "@/new/photos/utils/native-stream"; import { ensure, ensureInteger, ensureNumber } from "@/utils/ensure"; diff --git a/web/apps/photos/src/services/upload/uploadHttpClient.ts b/web/apps/photos/src/services/upload/uploadHttpClient.ts index 4094b4e0f4..86fbbb2b29 100644 --- a/web/apps/photos/src/services/upload/uploadHttpClient.ts +++ b/web/apps/photos/src/services/upload/uploadHttpClient.ts @@ -1,6 +1,6 @@ import log from "@/base/log"; import { apiURL, uploaderOrigin } from "@/base/origins"; -import { EnteFile } from "@/new/photos/types/file"; +import { EnteFile } from "@/media/file"; import { wait } from "@/utils/promise"; import { CustomError, handleUploadError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; diff --git a/web/apps/photos/src/services/upload/uploadManager.ts b/web/apps/photos/src/services/upload/uploadManager.ts index 817e4c535c..f6a2b733d5 100644 --- a/web/apps/photos/src/services/upload/uploadManager.ts +++ b/web/apps/photos/src/services/upload/uploadManager.ts @@ -5,6 +5,7 @@ import log from "@/base/log"; import type { Electron } from "@/base/types/ipc"; import { ComlinkWorker } from "@/base/worker/comlink-worker"; import type { Collection } from "@/media/collection"; +import { EncryptedEnteFile, EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import { potentialFileTypeFromExtension } from "@/media/live-photo"; import { getLocalFiles, sortFiles } from "@/new/photos/services/files"; @@ -15,7 +16,6 @@ import { UPLOAD_RESULT, UPLOAD_STAGES, } from "@/new/photos/services/upload/types"; -import { EncryptedEnteFile, EnteFile } from "@/new/photos/types/file"; import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; import { CustomError } from "@ente/shared/error"; diff --git a/web/apps/photos/src/services/watch.ts b/web/apps/photos/src/services/watch.ts index e17e054978..edc9f1e36c 100644 --- a/web/apps/photos/src/services/watch.ts +++ b/web/apps/photos/src/services/watch.ts @@ -12,9 +12,9 @@ import type { FolderWatchSyncedFile, } from "@/base/types/ipc"; import type { Collection } from "@/media/collection"; +import { EncryptedEnteFile } from "@/media/file"; import { getLocalFiles } from "@/new/photos/services/files"; import { UPLOAD_RESULT } from "@/new/photos/services/upload/types"; -import { EncryptedEnteFile } from "@/new/photos/types/file"; import { ensureString } from "@/utils/ensure"; import debounce from "debounce"; import uploadManager, { diff --git a/web/apps/photos/src/types/export/index.ts b/web/apps/photos/src/types/export/index.ts index 6767c3e869..16b258ba67 100644 --- a/web/apps/photos/src/types/export/index.ts +++ b/web/apps/photos/src/types/export/index.ts @@ -1,4 +1,4 @@ -import { EnteFile } from "@/new/photos/types/file"; +import { EnteFile } from "@/media/file"; import type { ExportStage } from "services/export"; export interface ExportProgress { diff --git a/web/apps/photos/src/types/gallery/index.ts b/web/apps/photos/src/types/gallery/index.ts index 9519fa79aa..d42aa2b7ee 100644 --- a/web/apps/photos/src/types/gallery/index.ts +++ b/web/apps/photos/src/types/gallery/index.ts @@ -1,6 +1,6 @@ import type { Collection } from "@/media/collection"; +import { EnteFile } from "@/media/file"; import { type SelectionContext } from "@/new/photos/components/gallery"; -import { EnteFile } from "@/new/photos/types/file"; import type { User } from "@ente/shared/user/types"; import { FilesDownloadProgressAttributes } from "components/FilesDownloadProgress"; import { TimeStampListItem } from "components/PhotoList"; diff --git a/web/apps/photos/src/types/publicCollection/index.ts b/web/apps/photos/src/types/publicCollection/index.ts index 41039a67e5..7f8a0995b1 100644 --- a/web/apps/photos/src/types/publicCollection/index.ts +++ b/web/apps/photos/src/types/publicCollection/index.ts @@ -1,5 +1,5 @@ import type { PublicURL } from "@/media/collection"; -import { EnteFile } from "@/new/photos/types/file"; +import { EnteFile } from "@/media/file"; import { TimeStampListItem } from "components/PhotoList"; export interface PublicCollectionGalleryContextType { diff --git a/web/apps/photos/src/utils/collection.ts b/web/apps/photos/src/utils/collection.ts index 62b1e4ce4b..3fc69b77d5 100644 --- a/web/apps/photos/src/utils/collection.ts +++ b/web/apps/photos/src/utils/collection.ts @@ -8,9 +8,9 @@ import { CollectionType, SUB_TYPE, } from "@/media/collection"; +import { EnteFile } from "@/media/file"; import { ItemVisibility } from "@/media/file-metadata"; import { getAllLocalFiles, getLocalFiles } from "@/new/photos/services/files"; -import { EnteFile } from "@/new/photos/types/file"; import { safeDirectoryName } from "@/new/photos/utils/native-fs"; import { CustomError } from "@ente/shared/error"; import { LS_KEYS, getData } from "@ente/shared/storage/localStorage"; diff --git a/web/apps/photos/src/utils/file/index.ts b/web/apps/photos/src/utils/file/index.ts index 8fdf689d16..2a990221c4 100644 --- a/web/apps/photos/src/utils/file/index.ts +++ b/web/apps/photos/src/utils/file/index.ts @@ -1,11 +1,6 @@ import { sharedCryptoWorker } from "@/base/crypto"; import log from "@/base/log"; import { type Electron } from "@/base/types/ipc"; -import { ItemVisibility } from "@/media/file-metadata"; -import { FileType } from "@/media/file-type"; -import { decodeLivePhoto } from "@/media/live-photo"; -import DownloadManager from "@/new/photos/services/download"; -import { updateExifIfNeededAndPossible } from "@/new/photos/services/exif-update"; import { EncryptedEnteFile, EnteFile, @@ -14,7 +9,12 @@ import { FilePublicMagicMetadata, FilePublicMagicMetadataProps, FileWithUpdatedMagicMetadata, -} from "@/new/photos/types/file"; +} from "@/media/file"; +import { ItemVisibility } from "@/media/file-metadata"; +import { FileType } from "@/media/file-type"; +import { decodeLivePhoto } from "@/media/live-photo"; +import DownloadManager from "@/new/photos/services/download"; +import { updateExifIfNeededAndPossible } from "@/new/photos/services/exif-update"; import { detectFileTypeInfo } from "@/new/photos/utils/detect-type"; import { mergeMetadata } from "@/new/photos/utils/file"; import { safeFileName } from "@/new/photos/utils/native-fs"; diff --git a/web/apps/photos/src/utils/magicMetadata/index.ts b/web/apps/photos/src/utils/magicMetadata/index.ts index dccd8109a5..f414f72eb8 100644 --- a/web/apps/photos/src/utils/magicMetadata/index.ts +++ b/web/apps/photos/src/utils/magicMetadata/index.ts @@ -1,7 +1,7 @@ import { sharedCryptoWorker } from "@/base/crypto"; import type { Collection } from "@/media/collection"; +import { EnteFile, MagicMetadataCore } from "@/media/file"; import { ItemVisibility } from "@/media/file-metadata"; -import { EnteFile, MagicMetadataCore } from "@/new/photos/types/file"; export function isArchivedFile(item: EnteFile): boolean { if (!item || !item.magicMetadata || !item.magicMetadata.data) { diff --git a/web/apps/photos/src/utils/photoFrame/index.ts b/web/apps/photos/src/utils/photoFrame/index.ts index b26d7e7013..1c52664b45 100644 --- a/web/apps/photos/src/utils/photoFrame/index.ts +++ b/web/apps/photos/src/utils/photoFrame/index.ts @@ -1,9 +1,9 @@ import log from "@/base/log"; +import type { LivePhotoSourceURL, SourceURLs } from "@/media/file"; +import { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import type { SelectionContext } from "@/new/photos/components/gallery"; import type { GalleryBarMode } from "@/new/photos/components/gallery/BarImpl"; -import type { LivePhotoSourceURL, SourceURLs } from "@/new/photos/types/file"; -import { EnteFile } from "@/new/photos/types/file"; import { ensure } from "@/utils/ensure"; import { SetSelectedState } from "types/gallery"; diff --git a/web/packages/media/collection.ts b/web/packages/media/collection.ts index 10303f9621..27e500dc7c 100644 --- a/web/packages/media/collection.ts +++ b/web/packages/media/collection.ts @@ -1,9 +1,9 @@ -import { ItemVisibility } from "@/media/file-metadata"; -import type { EnteFile } from "@/new/photos/types/file"; +import type { EnteFile } from "@/media/file"; import { type EncryptedMagicMetadata, type MagicMetadataCore, -} from "@/new/photos/types/file"; +} from "@/media/file"; +import { ItemVisibility } from "@/media/file-metadata"; // TODO: Audit this file diff --git a/web/packages/media/file-metadata.ts b/web/packages/media/file-metadata.ts index 4087475940..180ade2beb 100644 --- a/web/packages/media/file-metadata.ts +++ b/web/packages/media/file-metadata.ts @@ -2,10 +2,7 @@ import { decryptMetadataJSON, encryptMetadataJSON } from "@/base/crypto"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; import { type Location } from "@/base/types"; -import { - type EnteFile, - type FilePublicMagicMetadata, -} from "@/new/photos/types/file"; +import { type EnteFile, type FilePublicMagicMetadata } from "@/media/file"; import { mergeMetadata1 } from "@/new/photos/utils/file"; import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; diff --git a/web/packages/media/file.ts b/web/packages/media/file.ts index 4ba2cca836..c510eb8fb5 100644 --- a/web/packages/media/file.ts +++ b/web/packages/media/file.ts @@ -1,4 +1,210 @@ -import type { Metadata } from "./file-metadata"; +import { type Metadata, ItemVisibility } from "./file-metadata"; + +// TODO: Audit this file. + +export interface MetadataFileAttributes { + encryptedData: string; + decryptionHeader: string; +} + +export interface S3FileAttributes { + objectKey: string; + decryptionHeader: string; +} + +export interface FileInfo { + fileSize: number; + thumbSize: number; +} + +export interface MagicMetadataCore { + version: number; + count: number; + header: string; + data: T; +} + +export type EncryptedMagicMetadata = MagicMetadataCore; + +export interface EncryptedEnteFile { + id: number; + collectionID: number; + ownerID: number; + file: S3FileAttributes; + thumbnail: S3FileAttributes; + metadata: MetadataFileAttributes; + info: FileInfo | undefined; + magicMetadata: EncryptedMagicMetadata; + pubMagicMetadata: EncryptedMagicMetadata; + encryptedKey: string; + keyDecryptionNonce: string; + isDeleted: boolean; + updationTime: number; +} + +export interface EnteFile + extends Omit< + EncryptedEnteFile, + | "metadata" + | "pubMagicMetadata" + | "magicMetadata" + | "encryptedKey" + | "keyDecryptionNonce" + > { + metadata: Metadata; + magicMetadata: FileMagicMetadata; + /** + * The envelope containing the public magic metadata associated with this + * file. + * + * In almost all cases, files will have associated public magic metadata + * since newer clients have something or the other they need to add to it. + * But its presence is not guaranteed. + */ + pubMagicMetadata?: FilePublicMagicMetadata; + isTrashed?: boolean; + /** + * The base64 encoded encryption key associated with this file. + * + * This key is used to encrypt both the file's contents, and any associated + * data (e.g., metadatum, thumbnail) for the file. + */ + key: string; + src?: string; + srcURLs?: SourceURLs; + msrc?: string; + html?: string; + w?: number; + h?: number; + title?: string; + deleteBy?: number; + isSourceLoaded?: boolean; + conversionFailed?: boolean; + isConverted?: boolean; +} + +export interface LivePhotoSourceURL { + image: () => Promise; + video: () => Promise; +} + +export interface LoadedLivePhotoSourceURL { + image: string; + video: string; +} + +export interface SourceURLs { + url: string | LivePhotoSourceURL | LoadedLivePhotoSourceURL; + isOriginal: boolean; + isRenderable: boolean; + type: "normal" | "livePhoto"; + /** + * Best effort attempt at obtaining the MIME type. + * + * Known cases where it is missing: + * + * - Live photos (these have a different code path for obtaining the URL). + * - A video that is passes the isPlayable test in the browser. + * + */ + mimeType?: string; +} + +export interface TrashRequest { + items: TrashRequestItems[]; +} + +export interface TrashRequestItems { + fileID: number; + collectionID: number; +} + +export interface FileWithUpdatedMagicMetadata { + file: EnteFile; + updatedMagicMetadata: FileMagicMetadata; +} + +export interface FileWithUpdatedPublicMagicMetadata { + file: EnteFile; + updatedPublicMagicMetadata: FilePublicMagicMetadata; +} + +export interface FileMagicMetadataProps { + /** + * The visibility of the file + * + * The file's visibility is user specific attribute, and thus we keep it in + * the private magic metadata. This allows the file's owner to share a file + * and edit its visibility without making revealing their visibility + * preference to the people with whom they have shared the file. + */ + visibility?: ItemVisibility; + filePaths?: string[]; +} + +export type FileMagicMetadata = MagicMetadataCore; + +export interface FilePublicMagicMetadataProps { + /** + * Modified value of the date time associated with an {@link EnteFile}. + * + * Epoch microseconds. + */ + editedTime?: number; + /** + * Edited name of the {@link EnteFile}. + * + * If the user edits the name of the file within Ente, then the edits are + * saved in this field. + */ + editedName?: string; + /** + * A arbitrary textual caption / description that the user has attached to + * the {@link EnteFile}. + */ + caption?: string; + uploaderName?: string; + /** + * Width of the image / video, in pixels. + */ + w?: number; + /** + * Height of the image / video, in pixels. + */ + h?: number; + /** + * Edited latitude for the {@link EnteFile}. + * + * If the user edits the location (latitude and longitude) of a file within + * Ente, then the edits will be stored as the {@link lat} and {@link long} + * properties in the file's public magic metadata. + */ + lat?: number; + /** + * Edited longitude for the {@link EnteFile}. + * + * See {@link long}. + */ + long?: number; +} + +export type FilePublicMagicMetadata = + MagicMetadataCore; + +export interface TrashItem extends Omit { + file: EnteFile; +} + +export interface EncryptedTrashItem { + file: EncryptedEnteFile; + isDeleted: boolean; + isRestored: boolean; + deleteBy: number; + createdAt: number; + updatedAt: number; +} + +export type Trash = TrashItem[]; export const hasFileHash = (file: Metadata) => !!file.hash || (!!file.imageHash && !!file.videoHash); diff --git a/web/packages/new/photos/components/PeopleList.tsx b/web/packages/new/photos/components/PeopleList.tsx index 1aa6827858..2fb88b4983 100644 --- a/web/packages/new/photos/components/PeopleList.tsx +++ b/web/packages/new/photos/components/PeopleList.tsx @@ -1,8 +1,8 @@ import { useIsSmallWidth } from "@/base/hooks"; import { pt } from "@/base/i18n"; +import type { EnteFile } from "@/media/file"; import { faceCrop, type AnnotatedFaceID } from "@/new/photos/services/ml"; import type { Person, PreviewableFace } from "@/new/photos/services/ml/people"; -import type { EnteFile } from "@/new/photos/types/file"; import { Skeleton, Typography, styled } from "@mui/material"; import { t } from "i18next"; import React, { useEffect, useState } from "react"; diff --git a/web/packages/new/photos/components/Tiles.tsx b/web/packages/new/photos/components/Tiles.tsx index cb0a340d85..134b3b8d1f 100644 --- a/web/packages/new/photos/components/Tiles.tsx +++ b/web/packages/new/photos/components/Tiles.tsx @@ -1,9 +1,9 @@ +import { type EnteFile } from "@/media/file"; import { LoadingThumbnail, StaticThumbnail, } from "@/new/photos/components/PlaceholderThumbnails"; import downloadManager from "@/new/photos/services/download"; -import { type EnteFile } from "@/new/photos/types/file"; import { styled } from "@mui/material"; import React, { useEffect, useState } from "react"; import { faceCrop } from "../services/ml"; diff --git a/web/packages/new/photos/services/collection/ui.ts b/web/packages/new/photos/services/collection/ui.ts index 4258bf288c..50dcb5b3f5 100644 --- a/web/packages/new/photos/services/collection/ui.ts +++ b/web/packages/new/photos/services/collection/ui.ts @@ -1,4 +1,4 @@ -import type { EnteFile } from "@/new/photos/types/file"; +import type { EnteFile } from "@/media/file"; export type CollectionSummaryType = | "folder" diff --git a/web/packages/new/photos/services/download.ts b/web/packages/new/photos/services/download.ts index 7231c1f6dc..7ba68a65c4 100644 --- a/web/packages/new/photos/services/download.ts +++ b/web/packages/new/photos/services/download.ts @@ -7,14 +7,10 @@ import { sharedCryptoWorker } from "@/base/crypto"; import { type CryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { customAPIOrigin } from "@/base/origins"; +import type { EnteFile, LivePhotoSourceURL, SourceURLs } from "@/media/file"; import { FileType } from "@/media/file-type"; import { decodeLivePhoto } from "@/media/live-photo"; import * as ffmpeg from "@/new/photos/services/ffmpeg"; -import type { - EnteFile, - LivePhotoSourceURL, - SourceURLs, -} from "@/new/photos/types/file"; import { renderableImageBlob } from "@/new/photos/utils/file"; import { ensure } from "@/utils/ensure"; import { CustomError } from "@ente/shared/error"; diff --git a/web/packages/new/photos/services/exif-update.ts b/web/packages/new/photos/services/exif-update.ts index ebf229fc15..64a343ad35 100644 --- a/web/packages/new/photos/services/exif-update.ts +++ b/web/packages/new/photos/services/exif-update.ts @@ -1,8 +1,8 @@ import { lowercaseExtension } from "@/base/file"; import log from "@/base/log"; +import type { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import piexif from "piexifjs"; -import type { EnteFile } from "../types/file"; /** * Return a new stream after applying Exif updates if applicable to the given diff --git a/web/packages/new/photos/services/file-data.ts b/web/packages/new/photos/services/file-data.ts index fda03b6cdf..c7367ccbea 100644 --- a/web/packages/new/photos/services/file-data.ts +++ b/web/packages/new/photos/services/file-data.ts @@ -1,7 +1,7 @@ import { encryptBlobB64 } from "@/base/crypto"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; -import type { EnteFile } from "@/new/photos/types/file"; +import type { EnteFile } from "@/media/file"; import { z } from "zod"; /** diff --git a/web/packages/new/photos/services/files.ts b/web/packages/new/photos/services/files.ts index 0c48c7b449..114ab79c5f 100644 --- a/web/packages/new/photos/services/files.ts +++ b/web/packages/new/photos/services/files.ts @@ -1,7 +1,7 @@ import { blobCache } from "@/base/blob-cache"; +import { type EnteFile, type Trash } from "@/media/file"; import { FileType } from "@/media/file-type"; import localForage from "@ente/shared/storage/localForage"; -import { type EnteFile, type Trash } from "../types/file"; import { mergeMetadata } from "../utils/file"; const FILES_TABLE = "files"; diff --git a/web/packages/new/photos/services/ml/blob.ts b/web/packages/new/photos/services/ml/blob.ts index ea1117ad52..234a030172 100644 --- a/web/packages/new/photos/services/ml/blob.ts +++ b/web/packages/new/photos/services/ml/blob.ts @@ -1,9 +1,9 @@ import { basename } from "@/base/file"; import type { ElectronMLWorker } from "@/base/types/ipc"; +import type { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import { decodeLivePhoto } from "@/media/live-photo"; import { ensure } from "@/utils/ensure"; -import type { EnteFile } from "../../types/file"; import { renderableImageBlob } from "../../utils/file"; import { readStream } from "../../utils/native-stream"; import DownloadManager from "../download"; diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index ab1eaa4137..fab47652ce 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -1,9 +1,9 @@ import { assertionFailed } from "@/base/assert"; import { newNonSecureID } from "@/base/id-worker"; import log from "@/base/log"; +import type { EnteFile } from "@/media/file"; import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; -import type { EnteFile } from "../../types/file"; import { savedCGroups, updateOrCreateUserEntities } from "../user-entity"; import { savedFaceClusters, saveFaceClusters } from "./db"; import { diff --git a/web/packages/new/photos/services/ml/crop.ts b/web/packages/new/photos/services/ml/crop.ts index d3d5bac145..4c2def7002 100644 --- a/web/packages/new/photos/services/ml/crop.ts +++ b/web/packages/new/photos/services/ml/crop.ts @@ -1,6 +1,6 @@ import { blobCache } from "@/base/blob-cache"; +import type { EnteFile } from "@/media/file"; import { ensure } from "@/utils/ensure"; -import type { EnteFile } from "../../types/file"; import { fetchRenderableEnteFileBlob } from "./blob"; import { type Box, type FaceIndex } from "./face"; import { clamp } from "./math"; diff --git a/web/packages/new/photos/services/ml/face.ts b/web/packages/new/photos/services/ml/face.ts index 5717342cb5..c93241cb23 100644 --- a/web/packages/new/photos/services/ml/face.ts +++ b/web/packages/new/photos/services/ml/face.ts @@ -9,7 +9,7 @@ import { assertionFailed } from "@/base/assert"; import type { ElectronMLWorker } from "@/base/types/ipc"; -import type { EnteFile } from "@/new/photos/types/file"; +import type { EnteFile } from "@/media/file"; import { Matrix } from "ml-matrix"; import { getSimilarityTransformation } from "similarity-transformation"; import type { ImageBitmapAndData } from "./blob"; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 802bd11610..c19f32abe0 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -9,8 +9,8 @@ import log from "@/base/log"; import { masterKeyFromSession } from "@/base/session-store"; import type { Electron } from "@/base/types/ipc"; import { ComlinkWorker } from "@/base/worker/comlink-worker"; +import type { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; -import type { EnteFile } from "@/new/photos/types/file"; import { ensure } from "@/utils/ensure"; import { throttled } from "@/utils/promise"; import { proxy, transfer } from "comlink"; diff --git a/web/packages/new/photos/services/ml/ml-data.ts b/web/packages/new/photos/services/ml/ml-data.ts index 41ac8ac39f..333ebee55a 100644 --- a/web/packages/new/photos/services/ml/ml-data.ts +++ b/web/packages/new/photos/services/ml/ml-data.ts @@ -1,6 +1,6 @@ import { decryptBlob } from "@/base/crypto"; import log from "@/base/log"; -import type { EnteFile } from "@/new/photos/types/file"; +import type { EnteFile } from "@/media/file"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import { gunzip, gzip } from "../../utils/gzip"; diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 671b82b7f0..b20988c074 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -1,6 +1,6 @@ import { assertionFailed } from "@/base/assert"; import log from "@/base/log"; -import type { EnteFile } from "../../types/file"; +import type { EnteFile } from "@/media/file"; import { getLocalFiles } from "../files"; import { savedCGroups, type CGroup } from "../user-entity"; import type { FaceCluster } from "./cluster"; diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index 51c8d23b5f..2babb54bba 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -5,7 +5,7 @@ import { getKVN } from "@/base/kv"; import { ensureAuthToken } from "@/base/local-user"; import log from "@/base/log"; import type { ElectronMLWorker } from "@/base/types/ipc"; -import type { EnteFile } from "@/new/photos/types/file"; +import type { EnteFile } from "@/media/file"; import { fileLogID } from "@/new/photos/utils/file"; import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts index 9c9123366f..c8012b8050 100644 --- a/web/packages/new/photos/services/search/types.ts +++ b/web/packages/new/photos/services/search/types.ts @@ -5,9 +5,9 @@ import type { Location } from "@/base/types"; import type { Collection } from "@/media/collection"; +import type { EnteFile } from "@/media/file"; import { FileType } from "@/media/file-type"; import type { Person } from "@/new/photos/services/ml/people"; -import type { EnteFile } from "@/new/photos/types/file"; import type { LocationTag } from "../user-entity"; /** diff --git a/web/packages/new/photos/services/search/worker.ts b/web/packages/new/photos/services/search/worker.ts index ca12c27168..a3f03a2be9 100644 --- a/web/packages/new/photos/services/search/worker.ts +++ b/web/packages/new/photos/services/search/worker.ts @@ -1,8 +1,8 @@ import { HTTPError } from "@/base/http"; import type { Location } from "@/base/types"; import type { Collection } from "@/media/collection"; +import type { EnteFile } from "@/media/file"; import { fileCreationPhotoDate, fileLocation } from "@/media/file-metadata"; -import type { EnteFile } from "@/new/photos/types/file"; import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { getPublicMagicMetadataSync } from "@ente/shared/file-metadata"; diff --git a/web/packages/new/photos/types/file.ts b/web/packages/new/photos/types/file.ts deleted file mode 100644 index f2e7a80abb..0000000000 --- a/web/packages/new/photos/types/file.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { type Metadata, ItemVisibility } from "@/media/file-metadata"; - -export interface MetadataFileAttributes { - encryptedData: string; - decryptionHeader: string; -} -export interface S3FileAttributes { - objectKey: string; - decryptionHeader: string; -} - -export interface FileInfo { - fileSize: number; - thumbSize: number; -} - -export interface MagicMetadataCore { - version: number; - count: number; - header: string; - data: T; -} - -export type EncryptedMagicMetadata = MagicMetadataCore; - -export interface EncryptedEnteFile { - id: number; - collectionID: number; - ownerID: number; - file: S3FileAttributes; - thumbnail: S3FileAttributes; - metadata: MetadataFileAttributes; - info: FileInfo | undefined; - magicMetadata: EncryptedMagicMetadata; - pubMagicMetadata: EncryptedMagicMetadata; - encryptedKey: string; - keyDecryptionNonce: string; - isDeleted: boolean; - updationTime: number; -} - -// TODO: Move into media -export interface EnteFile - extends Omit< - EncryptedEnteFile, - | "metadata" - | "pubMagicMetadata" - | "magicMetadata" - | "encryptedKey" - | "keyDecryptionNonce" - > { - metadata: Metadata; - magicMetadata: FileMagicMetadata; - /** - * The envelope containing the public magic metadata associated with this - * file. - * - * In almost all cases, files will have associated public magic metadata - * since newer clients have something or the other they need to add to it. - * But its presence is not guaranteed. - */ - pubMagicMetadata?: FilePublicMagicMetadata; - isTrashed?: boolean; - /** - * The base64 encoded encryption key associated with this file. - * - * This key is used to encrypt both the file's contents, and any associated - * data (e.g., metadatum, thumbnail) for the file. - */ - key: string; - src?: string; - srcURLs?: SourceURLs; - msrc?: string; - html?: string; - w?: number; - h?: number; - title?: string; - deleteBy?: number; - isSourceLoaded?: boolean; - conversionFailed?: boolean; - isConverted?: boolean; -} - -export interface LivePhotoSourceURL { - image: () => Promise; - video: () => Promise; -} - -export interface LoadedLivePhotoSourceURL { - image: string; - video: string; -} - -export interface SourceURLs { - url: string | LivePhotoSourceURL | LoadedLivePhotoSourceURL; - isOriginal: boolean; - isRenderable: boolean; - type: "normal" | "livePhoto"; - /** - * Best effort attempt at obtaining the MIME type. - * - * Known cases where it is missing: - * - * - Live photos (these have a different code path for obtaining the URL). - * - A video that is passes the isPlayable test in the browser. - * - */ - mimeType?: string; -} - -export interface TrashRequest { - items: TrashRequestItems[]; -} - -export interface TrashRequestItems { - fileID: number; - collectionID: number; -} - -export interface FileWithUpdatedMagicMetadata { - file: EnteFile; - updatedMagicMetadata: FileMagicMetadata; -} - -export interface FileWithUpdatedPublicMagicMetadata { - file: EnteFile; - updatedPublicMagicMetadata: FilePublicMagicMetadata; -} - -export interface FileMagicMetadataProps { - /** - * The visibility of the file - * - * The file's visibility is user specific attribute, and thus we keep it in - * the private magic metadata. This allows the file's owner to share a file - * and edit its visibility without making revealing their visibility - * preference to the people with whom they have shared the file. - */ - visibility?: ItemVisibility; - filePaths?: string[]; -} - -export type FileMagicMetadata = MagicMetadataCore; - -export interface FilePublicMagicMetadataProps { - /** - * Modified value of the date time associated with an {@link EnteFile}. - * - * Epoch microseconds. - */ - editedTime?: number; - /** - * Edited name of the {@link EnteFile}. - * - * If the user edits the name of the file within Ente, then the edits are - * saved in this field. - */ - editedName?: string; - /** - * A arbitrary textual caption / description that the user has attached to - * the {@link EnteFile}. - */ - caption?: string; - uploaderName?: string; - /** - * Width of the image / video, in pixels. - */ - w?: number; - /** - * Height of the image / video, in pixels. - */ - h?: number; - /** - * Edited latitude for the {@link EnteFile}. - * - * If the user edits the location (latitude and longitude) of a file within - * Ente, then the edits will be stored as the {@link lat} and {@link long} - * properties in the file's public magic metadata. - */ - lat?: number; - /** - * Edited longitude for the {@link EnteFile}. - * - * See {@link long}. - */ - long?: number; -} - -export type FilePublicMagicMetadata = - MagicMetadataCore; - -export interface TrashItem extends Omit { - file: EnteFile; -} - -export interface EncryptedTrashItem { - file: EncryptedEnteFile; - isDeleted: boolean; - isRestored: boolean; - deleteBy: number; - createdAt: number; - updatedAt: number; -} - -export type Trash = TrashItem[]; diff --git a/web/packages/new/photos/utils/file.ts b/web/packages/new/photos/utils/file.ts index 8c9d371e0d..7f83b0e933 100644 --- a/web/packages/new/photos/utils/file.ts +++ b/web/packages/new/photos/utils/file.ts @@ -2,9 +2,9 @@ import { isDesktop } from "@/base/app"; import log from "@/base/log"; import { CustomErrorMessage } from "@/base/types/ipc"; import { workerBridge } from "@/base/worker/worker-bridge"; +import type { EnteFile } from "@/media/file"; import { needsJPEGConversion } from "@/media/formats"; import { heicToJPEG } from "@/media/heic-convert"; -import type { EnteFile } from "../types/file"; import { detectFileTypeInfo } from "./detect-type"; /** diff --git a/web/packages/shared/file-metadata.ts b/web/packages/shared/file-metadata.ts index 93c68af85e..a9652c9470 100644 --- a/web/packages/shared/file-metadata.ts +++ b/web/packages/shared/file-metadata.ts @@ -1,9 +1,9 @@ import { isDevBuild } from "@/base/env"; +import type { EnteFile } from "@/media/file"; import { decryptPublicMagicMetadata, type PublicMagicMetadata, } from "@/media/file-metadata"; -import type { EnteFile } from "@/new/photos/types/file"; import { fileLogID } from "@/new/photos/utils/file"; /**