From 4a5f13d0e56da501bcb520449ff8b4a9b6a660f6 Mon Sep 17 00:00:00 2001 From: bo0tzz Date: Fri, 24 Jul 2026 16:06:32 +0200 Subject: [PATCH] fix: don't skip person thumbnail generation if ML is disabled (#30194) --- server/src/services/media.service.spec.ts | 13 +++++++++---- server/src/services/media.service.ts | 8 ++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index 58b797a18b..290bf947a1 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -1507,12 +1507,17 @@ describe(MediaService.name, () => { }); describe('handleGeneratePersonThumbnail', () => { - it('should skip if machine learning is disabled', async () => { + it('should generate a thumbnail even if machine learning is disabled', async () => { mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.machineLearningDisabled); + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.newThumbnailMiddle); + mocks.media.generateThumbnail.mockResolvedValue(); + mocks.media.decodeImage.mockResolvedValue({ + data: Buffer.from(''), + info: { width: 1000, height: 1000 } as OutputInfo, + }); - await expect(sut.handleGeneratePersonThumbnail({ id: 'person-1' })).resolves.toBe(JobStatus.Skipped); - expect(mocks.asset.getByIds).not.toHaveBeenCalled(); - expect(mocks.systemMetadata.get).toHaveBeenCalled(); + await expect(sut.handleGeneratePersonThumbnail({ id: 'person-1' })).resolves.toBe(JobStatus.Success); + expect(mocks.media.generateThumbnail).toHaveBeenCalled(); }); it('should skip a person not found', async () => { diff --git a/server/src/services/media.service.ts b/server/src/services/media.service.ts index 37817e0508..956636dd51 100644 --- a/server/src/services/media.service.ts +++ b/server/src/services/media.service.ts @@ -43,7 +43,7 @@ import { getAssetFile, getDimensions } from 'src/utils/asset.util'; import { checkFaceVisibility, checkOcrVisibility } from 'src/utils/editor'; import { BaseConfig, ThumbnailConfig } from 'src/utils/media'; import { mimeTypes } from 'src/utils/mime-types'; -import { clamp, isFaceImportEnabled, isFacialRecognitionEnabled } from 'src/utils/misc'; +import { clamp } from 'src/utils/misc'; import { getOutputDimensions } from 'src/utils/transform'; interface UpsertFileOptions { @@ -410,11 +410,7 @@ export class MediaService extends BaseService { @OnJob({ name: JobName.PersonGenerateThumbnail, queue: QueueName.ThumbnailGeneration }) async handleGeneratePersonThumbnail({ id }: JobOf): Promise { - const { machineLearning, metadata, image } = await this.getConfig({ withCache: true }); - if (!isFacialRecognitionEnabled(machineLearning) && !isFaceImportEnabled(metadata)) { - return JobStatus.Skipped; - } - + const { image } = await this.getConfig({ withCache: true }); const data = await this.personRepository.getDataForThumbnailGenerationJob(id); if (!data) { this.logger.error(`Could not generate person thumbnail for ${id}: missing data`);