feat(server): generate all thumbnails for an asset in one job (#13012)

* wip

cleanup

add success logs, rename method

do thumbhash too

fixes

fix tests

handle `notify`

wip refactor

refactor

* update tests

* update sql

* pr feedback

* remove unused code

* formatting
This commit is contained in:
Mert
2024-09-28 13:47:24 -04:00
committed by GitHub
parent 995f0fda47
commit 2bcd27e166
22 changed files with 574 additions and 542 deletions
+10 -37
View File
@@ -2,7 +2,7 @@ import { BadRequestException, NotFoundException } from '@nestjs/common';
import { BulkIdErrorReason } from 'src/dtos/asset-ids.response.dto';
import { PersonResponseDto, mapFaces, mapPerson } from 'src/dtos/person.dto';
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
import { CacheControl, Colorspace, SourceType, SystemMetadataKey } from 'src/enum';
import { CacheControl, Colorspace, ImageFormat, SourceType, SystemMetadataKey } from 'src/enum';
import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.interface';
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
import { IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
@@ -961,12 +961,11 @@ describe(PersonService.name, () => {
expect(storageMock.mkdirSync).toHaveBeenCalledWith('upload/thumbs/admin_id/pe/rs');
expect(mediaMock.generateThumbnail).toHaveBeenCalledWith(
assetStub.primaryImage.originalPath,
'upload/thumbs/admin_id/pe/rs/person-1.jpeg',
{
format: 'jpeg',
colorspace: Colorspace.P3,
format: ImageFormat.JPEG,
size: 250,
quality: 80,
colorspace: Colorspace.P3,
crop: {
left: 238,
top: 163,
@@ -975,6 +974,7 @@ describe(PersonService.name, () => {
},
processInvalidImages: false,
},
'upload/thumbs/admin_id/pe/rs/person-1.jpeg',
);
expect(personMock.update).toHaveBeenCalledWith({
id: 'person-1',
@@ -990,13 +990,12 @@ describe(PersonService.name, () => {
await sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id });
expect(mediaMock.generateThumbnail).toHaveBeenCalledWith(
assetStub.image.originalPath,
'upload/thumbs/admin_id/pe/rs/person-1.jpeg',
assetStub.primaryImage.originalPath,
{
format: 'jpeg',
colorspace: Colorspace.P3,
format: ImageFormat.JPEG,
size: 250,
quality: 80,
colorspace: Colorspace.P3,
crop: {
left: 0,
top: 85,
@@ -1005,6 +1004,7 @@ describe(PersonService.name, () => {
},
processInvalidImages: false,
},
'upload/thumbs/admin_id/pe/rs/person-1.jpeg',
);
});
@@ -1017,12 +1017,11 @@ describe(PersonService.name, () => {
expect(mediaMock.generateThumbnail).toHaveBeenCalledWith(
assetStub.primaryImage.originalPath,
'upload/thumbs/admin_id/pe/rs/person-1.jpeg',
{
format: 'jpeg',
colorspace: Colorspace.P3,
format: ImageFormat.JPEG,
size: 250,
quality: 80,
colorspace: Colorspace.P3,
crop: {
left: 591,
top: 591,
@@ -1031,33 +1030,7 @@ describe(PersonService.name, () => {
},
processInvalidImages: false,
},
);
});
it('should use preview path for videos', async () => {
personMock.getById.mockResolvedValue({ ...personStub.primaryPerson, faceAssetId: faceStub.end.assetId });
personMock.getFaceByIdWithAssets.mockResolvedValue(faceStub.end);
assetMock.getById.mockResolvedValue(assetStub.video);
mediaMock.getImageDimensions.mockResolvedValue({ width: 2560, height: 1440 });
await sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id });
expect(mediaMock.generateThumbnail).toHaveBeenCalledWith(
'/uploads/user-id/thumbs/path.jpg',
'upload/thumbs/admin_id/pe/rs/person-1.jpeg',
{
format: 'jpeg',
size: 250,
quality: 80,
colorspace: Colorspace.P3,
crop: {
left: 1741,
top: 851,
width: 588,
height: 588,
},
processInvalidImages: false,
},
);
});
});