mirror of
https://github.com/immich-app/immich.git
synced 2025-07-09 03:04:16 -04:00
fix(server): untracked thumbnail and preview images (#9126)
* delete old thumbnails * add tests * revert invisible asset handling
This commit is contained in:
parent
19aa97da02
commit
2648032163
@ -251,6 +251,17 @@ describe(MediaService.name, () => {
|
|||||||
expect(assetMock.update).toHaveBeenCalledWith({ id: 'asset-id', previewPath });
|
expect(assetMock.update).toHaveBeenCalledWith({ id: 'asset-id', previewPath });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should delete previous preview if different path', async () => {
|
||||||
|
const previousPreviewPath = assetStub.image.previewPath;
|
||||||
|
|
||||||
|
configMock.load.mockResolvedValue([{ key: SystemConfigKey.IMAGE_THUMBNAIL_FORMAT, value: ImageFormat.WEBP }]);
|
||||||
|
assetMock.getByIds.mockResolvedValue([assetStub.image]);
|
||||||
|
|
||||||
|
await sut.handleGeneratePreview({ id: assetStub.image.id });
|
||||||
|
|
||||||
|
expect(storageMock.unlink).toHaveBeenCalledWith(previousPreviewPath);
|
||||||
|
});
|
||||||
|
|
||||||
it('should generate a P3 thumbnail for a wide gamut image', async () => {
|
it('should generate a P3 thumbnail for a wide gamut image', async () => {
|
||||||
assetMock.getByIds.mockResolvedValue([
|
assetMock.getByIds.mockResolvedValue([
|
||||||
{ ...assetStub.image, exifInfo: { profileDescription: 'Adobe RGB', bitsPerSample: 14 } as ExifEntity },
|
{ ...assetStub.image, exifInfo: { profileDescription: 'Adobe RGB', bitsPerSample: 14 } as ExifEntity },
|
||||||
@ -390,6 +401,17 @@ describe(MediaService.name, () => {
|
|||||||
expect(assetMock.update).toHaveBeenCalledWith({ id: 'asset-id', thumbnailPath });
|
expect(assetMock.update).toHaveBeenCalledWith({ id: 'asset-id', thumbnailPath });
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
it('should delete previous thumbnail if different path', async () => {
|
||||||
|
const previousThumbnailPath = assetStub.image.thumbnailPath;
|
||||||
|
|
||||||
|
configMock.load.mockResolvedValue([{ key: SystemConfigKey.IMAGE_THUMBNAIL_FORMAT, value: ImageFormat.WEBP }]);
|
||||||
|
assetMock.getByIds.mockResolvedValue([assetStub.image]);
|
||||||
|
|
||||||
|
await sut.handleGenerateThumbnail({ id: assetStub.image.id });
|
||||||
|
|
||||||
|
expect(storageMock.unlink).toHaveBeenCalledWith(previousThumbnailPath);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should generate a P3 thumbnail for a wide gamut image', async () => {
|
it('should generate a P3 thumbnail for a wide gamut image', async () => {
|
||||||
|
@ -185,6 +185,10 @@ export class MediaService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const previewPath = await this.generateThumbnail(asset, AssetPathType.PREVIEW, image.previewFormat);
|
const previewPath = await this.generateThumbnail(asset, AssetPathType.PREVIEW, image.previewFormat);
|
||||||
|
if (asset.previewPath && asset.previewPath !== previewPath) {
|
||||||
|
this.logger.debug(`Deleting old preview for asset ${asset.id}`);
|
||||||
|
await this.storageRepository.unlink(asset.previewPath);
|
||||||
|
}
|
||||||
await this.assetRepository.update({ id: asset.id, previewPath });
|
await this.assetRepository.update({ id: asset.id, previewPath });
|
||||||
return JobStatus.SUCCESS;
|
return JobStatus.SUCCESS;
|
||||||
}
|
}
|
||||||
@ -253,6 +257,10 @@ export class MediaService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const thumbnailPath = await this.generateThumbnail(asset, AssetPathType.THUMBNAIL, image.thumbnailFormat);
|
const thumbnailPath = await this.generateThumbnail(asset, AssetPathType.THUMBNAIL, image.thumbnailFormat);
|
||||||
|
if (asset.thumbnailPath && asset.thumbnailPath !== thumbnailPath) {
|
||||||
|
this.logger.debug(`Deleting old thumbnail for asset ${asset.id}`);
|
||||||
|
await this.storageRepository.unlink(asset.thumbnailPath);
|
||||||
|
}
|
||||||
await this.assetRepository.update({ id: asset.id, thumbnailPath });
|
await this.assetRepository.update({ id: asset.id, thumbnailPath });
|
||||||
return JobStatus.SUCCESS;
|
return JobStatus.SUCCESS;
|
||||||
}
|
}
|
||||||
|
18
server/test/fixtures/asset.stub.ts
vendored
18
server/test/fixtures/asset.stub.ts
vendored
@ -471,6 +471,24 @@ export const assetStub = {
|
|||||||
},
|
},
|
||||||
} as AssetEntity),
|
} as AssetEntity),
|
||||||
|
|
||||||
|
liveMotionWithThumb: Object.freeze({
|
||||||
|
id: fileStub.livePhotoMotion.uuid,
|
||||||
|
originalPath: fileStub.livePhotoMotion.originalPath,
|
||||||
|
ownerId: authStub.user1.user.id,
|
||||||
|
type: AssetType.VIDEO,
|
||||||
|
isVisible: false,
|
||||||
|
fileModifiedAt: new Date('2022-06-19T23:41:36.910Z'),
|
||||||
|
fileCreatedAt: new Date('2022-06-19T23:41:36.910Z'),
|
||||||
|
libraryId: 'library-id',
|
||||||
|
library: libraryStub.uploadLibrary1,
|
||||||
|
previewPath: '/uploads/user-id/thumbs/path.ext',
|
||||||
|
thumbnailPath: '/uploads/user-id/webp/path.ext',
|
||||||
|
exifInfo: {
|
||||||
|
fileSizeInByte: 100_000,
|
||||||
|
timeZone: `America/New_York`,
|
||||||
|
},
|
||||||
|
} as AssetEntity),
|
||||||
|
|
||||||
livePhotoStillAsset: Object.freeze({
|
livePhotoStillAsset: Object.freeze({
|
||||||
id: 'live-photo-still-asset',
|
id: 'live-photo-still-asset',
|
||||||
originalPath: fileStub.livePhotoStill.originalPath,
|
originalPath: fileStub.livePhotoStill.originalPath,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user