From 96c3880e388df46d5dc6f89a07227ccab434f93f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 12 May 2025 19:28:40 +0530 Subject: [PATCH] filter files in trash --- web/packages/gallery/services/video.ts | 17 ++++++++++++----- web/packages/new/photos/services/files.ts | 7 +++++++ web/packages/new/photos/services/ml/db.ts | 5 ++--- web/packages/new/photos/services/ml/worker.ts | 6 ++---- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/web/packages/gallery/services/video.ts b/web/packages/gallery/services/video.ts index 2972f13b40..84574821ad 100644 --- a/web/packages/gallery/services/video.ts +++ b/web/packages/gallery/services/video.ts @@ -15,6 +15,7 @@ import { fileLogID, type EnteFile } from "ente-media/file"; import { FileType } from "ente-media/file-type"; import { getAllLocalFiles, + getLocalTrashFileIDs, uniqueFilesByID, } from "ente-new/photos/services/files"; import { settingsSnapshot } from "ente-new/photos/services/settings"; @@ -711,15 +712,21 @@ const backfillQueue = async ( userID: number, ): Promise => { const allCollectionFiles = await getAllLocalFiles(); + const localTrashFileIDs = await getLocalTrashFileIDs(); + const videoFiles = uniqueFilesByID( + allCollectionFiles.filter( + (f) => + f.ownerID == userID && + f.metadata.fileType == FileType.video && + !localTrashFileIDs.has(f.id), + ), + ); + const doneIDs = (await savedProcessedVideoFileIDs()).union( await savedFailedVideoFileIDs(), ); - const videoFiles = uniqueFilesByID( - allCollectionFiles.filter( - (f) => f.ownerID == userID && f.metadata.fileType == FileType.video, - ), - ); const pendingVideoFiles = videoFiles.filter((f) => !doneIDs.has(f.id)); + const batch = randomSample(pendingVideoFiles, 50); return batch.map((file) => ({ file })); }; diff --git a/web/packages/new/photos/services/files.ts b/web/packages/new/photos/services/files.ts index a3fad3982e..56752ee480 100644 --- a/web/packages/new/photos/services/files.ts +++ b/web/packages/new/photos/services/files.ts @@ -242,6 +242,13 @@ export function getTrashedFiles(trash: Trash): EnteFile[] { ); } +/** + * Return the IDs of all the files that are part of the trash as per our local + * database. + */ +export const getLocalTrashFileIDs = () => + getLocalTrash().then((trash) => new Set(trash.map((f) => f.file.id))); + const sortTrashFiles = (files: EnteFile[]) => { return files.sort((a, b) => { if (a.deleteBy === b.deleteBy) { diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index a8eb9398bd..a253803919 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -255,7 +255,7 @@ export const addFileEntry = async (fileID: number) => { */ export const updateAssumingLocalFiles = async ( localFileIDs: number[], - localTrashFilesIDs: number[], + localTrashFilesIDs: Set, ) => { const db = await mlDB(); const tx = db.transaction( @@ -268,14 +268,13 @@ export const updateAssumingLocalFiles = async ( .getAllKeys(IDBKeyRange.only("indexed")); const local = new Set(localFileIDs); - const localTrash = new Set(localTrashFilesIDs); const fdb = new Set(fdbFileIDs); const fdbIndexed = new Set(fdbIndexedFileIDs); const newFileIDs = localFileIDs.filter((id) => !fdb.has(id)); const removedFileIDs = fdbFileIDs.filter((id) => { if (local.has(id)) return false; // Still exists. - if (localTrash.has(id)) { + if (localTrashFilesIDs.has(id)) { // Exists in trash. if (fdbIndexed.has(id)) { // But is already indexed, so let it be. diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index f3138ad639..5609c0c67e 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -9,7 +9,7 @@ import { isNetworkDownloadError } from "ente-gallery/services/download"; import type { ProcessableUploadItem } from "ente-gallery/services/upload"; import { fileLogID, type EnteFile } from "ente-media/file"; import { wait } from "ente-utils/promise"; -import { getAllLocalFiles, getLocalTrashedFiles } from "../files"; +import { getAllLocalFiles, getLocalTrashFileIDs } from "../files"; import { createImageBitmapAndData, fetchRenderableBlob, @@ -438,11 +438,9 @@ const syncWithLocalFilesAndGetFilesToIndex = async ( const localFiles = await getAllLocalFiles(); const localFileByID = new Map(localFiles.map((f) => [f.id, f])); - const localTrashFileIDs = (await getLocalTrashedFiles()).map((f) => f.id); - await updateAssumingLocalFiles( Array.from(localFileByID.keys()), - localTrashFileIDs, + await getLocalTrashFileIDs(), ); const fileIDsToIndex = await getIndexableFileIDs(count);