diff --git a/web/apps/photos/src/components/ml/PeopleList.tsx b/web/apps/photos/src/components/ml/PeopleList.tsx index 75748206b..96dd2cacd 100644 --- a/web/apps/photos/src/components/ml/PeopleList.tsx +++ b/web/apps/photos/src/components/ml/PeopleList.tsx @@ -61,8 +61,8 @@ export const PeopleList = React.memo((props: PeopleListProps) => { } > ))} @@ -141,7 +141,7 @@ export function UnidentifiedFaces(props: { ))} @@ -151,13 +151,13 @@ export function UnidentifiedFaces(props: { } interface FaceCropImageViewProps { - url: string; faceId: string; + cacheKey?: string; } const FaceCropImageView: React.FC = ({ - url, faceId, + cacheKey, }) => { const [objectURL, setObjectURL] = useState(); @@ -165,22 +165,18 @@ const FaceCropImageView: React.FC = ({ let didCancel = false; async function loadImage() { - let blob: Blob; - if (!url) { - blob = undefined; - } else { - blob = await cachedOrNew("face-crops", url, async () => { - const user = await ensureLocalUser(); - return machineLearningService.regenerateFaceCrop( - user.token, - user.id, - faceId, - ); - }); - } - - if (didCancel) return; - setObjectURL(blob ? URL.createObjectURL(blob) : undefined); + const blob = cacheKey + ? await cachedOrNew("face-crops", cacheKey, async () => { + const user = await ensureLocalUser(); + return machineLearningService.regenerateFaceCrop( + user.token, + user.id, + faceId, + ); + }) + : undefined; + if (!didCancel) + setObjectURL(blob ? URL.createObjectURL(blob) : undefined); } loadImage(); @@ -189,7 +185,7 @@ const FaceCropImageView: React.FC = ({ didCancel = true; if (objectURL) URL.revokeObjectURL(objectURL); }; - }, [url, faceId]); + }, [faceId, cacheKey]); return objectURL ? ( diff --git a/web/apps/photos/src/services/machineLearning/faceService.ts b/web/apps/photos/src/services/machineLearning/faceService.ts index 9c56ef45f..052ed020d 100644 --- a/web/apps/photos/src/services/machineLearning/faceService.ts +++ b/web/apps/photos/src/services/machineLearning/faceService.ts @@ -229,13 +229,8 @@ class FaceService { const blobOptions = syncContext.config.faceCrop.blobOptions; const blob = await imageBitmapToBlob(faceCrop.image, blobOptions); - const faceCropUrl = `/${face.id}`; - const faceCropCache = await openCache("face-crops"); - await faceCropCache.put(faceCropUrl, blob); - face.crop = { - imageUrl: faceCropUrl, - imageBox: faceCrop.imageBox, - }; + const cache = await openCache("face-crops"); + await cache.put(face.id, blob); faceCrop.image.close(); diff --git a/web/apps/photos/src/services/machineLearning/peopleService.ts b/web/apps/photos/src/services/machineLearning/peopleService.ts index dbd2706bc..ad7d7bcec 100644 --- a/web/apps/photos/src/services/machineLearning/peopleService.ts +++ b/web/apps/photos/src/services/machineLearning/peopleService.ts @@ -62,7 +62,7 @@ class PeopleService { (a, b) => b.detection.probability - a.detection.probability, ); - if (personFace && !personFace.crop?.imageUrl) { + if (personFace && !personFace.crop?.cacheKey) { const file = await getLocalFile(personFace.fileId); const imageBitmap = await getOriginalImageBitmap(file); await FaceService.saveFaceCrop( @@ -76,7 +76,7 @@ class PeopleService { id: index, files: faces.map((f) => f.fileId), displayFaceId: personFace?.id, - displayImageUrl: personFace?.crop?.imageUrl, + faceCropCacheKey: personFace?.crop?.cacheKey, }; await mlIDbStorage.putPerson(person); diff --git a/web/apps/photos/src/types/machineLearning/index.ts b/web/apps/photos/src/types/machineLearning/index.ts index d0c902333..7fee94815 100644 --- a/web/apps/photos/src/types/machineLearning/index.ts +++ b/web/apps/photos/src/types/machineLearning/index.ts @@ -90,7 +90,7 @@ export interface FaceCrop { } export interface StoredFaceCrop { - imageUrl: string; + cacheKey: string; imageBox: Box; } @@ -128,7 +128,7 @@ export interface Person { name?: string; files: Array; displayFaceId?: string; - displayImageUrl?: string; + faceCropCacheKey?: string; } export interface MlFileData {