diff --git a/e2e/src/api/specs/asset.e2e-spec.ts b/e2e/src/api/specs/asset.e2e-spec.ts index 90999b87ed..ab3252c40b 100644 --- a/e2e/src/api/specs/asset.e2e-spec.ts +++ b/e2e/src/api/specs/asset.e2e-spec.ts @@ -1116,7 +1116,7 @@ describe('/asset', () => { expect(response.status).toBe(AssetMediaStatus.Created); const id = response.id; // longer timeout as the thumbnail generation from full-size raw files can take a while - await utils.waitForWebsocketEvent({ event: 'assetUpload', id, timeout: 20_000 }); + await utils.waitForWebsocketEvent({ event: 'assetUpload', id }); const asset = await utils.getAssetInfo(admin.accessToken, id); expect(asset.exifInfo).toBeDefined(); diff --git a/server/src/services/media.service.ts b/server/src/services/media.service.ts index e863cb1e3d..77b5302ae5 100644 --- a/server/src/services/media.service.ts +++ b/server/src/services/media.service.ts @@ -42,6 +42,7 @@ import { getAssetFiles, getDimensions } from 'src/utils/asset.util'; import { BaseConfig, ThumbnailConfig } from 'src/utils/media'; import { mimeTypes } from 'src/utils/mime-types'; import { clamp, isFaceImportEnabled, isFacialRecognitionEnabled } from 'src/utils/misc'; +import { getOutputDimensions } from 'src/utils/transform'; interface UpsertFileOptions { assetId: string; type: AssetFileType; @@ -422,9 +423,10 @@ export class MediaService extends BaseService { await Promise.all(promises); } - const dims = await this.mediaRepository.getImageDimensions(fullsizePath ?? asset.originalPath); + const decodedDimensions = { width: info.width, height: info.height }; + const fullsizeDimensions = useEdits ? getOutputDimensions(asset.edits, decodedDimensions) : decodedDimensions; - return { previewPath, thumbnailPath, fullsizePath, thumbhash: outputs[0] as Buffer, fullsizeDimensions: dims }; + return { previewPath, thumbnailPath, fullsizePath, thumbhash: outputs[0] as Buffer, fullsizeDimensions }; } @OnJob({ name: JobName.PersonGenerateThumbnail, queue: QueueName.ThumbnailGeneration }) diff --git a/server/src/utils/transform.ts b/server/src/utils/transform.ts index bb678fccbc..3763f3d236 100644 --- a/server/src/utils/transform.ts +++ b/server/src/utils/transform.ts @@ -3,6 +3,27 @@ import { AssetOcrResponseDto } from 'src/dtos/ocr.dto'; import { ImageDimensions } from 'src/types'; import { applyToPoint, compose, flipX, flipY, identity, Matrix, rotate, scale, translate } from 'transformation-matrix'; +export const getOutputDimensions = (edits: EditActionItem[], startingDimensions: ImageDimensions): ImageDimensions => { + let { width, height } = startingDimensions; + + const crop = edits.find((edit) => edit.action === EditAction.Crop); + if (crop) { + width = crop.parameters.width; + height = crop.parameters.height; + } + + for (const edit of edits) { + if (edit.action === EditAction.Rotate) { + const angleDegrees = edit.parameters.angle; + if (angleDegrees === 90 || angleDegrees === 270) { + [width, height] = [height, width]; + } + } + } + + return { width, height }; +}; + export const createAffineMatrix = ( edits: EditActionItem[], scalingParameters?: {