1
0
mirror of https://github.com/immich-app/immich.git synced 2024-12-25 10:43:13 +02:00

fix(server): generate thumbnail job uses stale path (#2236)

* fix(server): generate thumbnail job' using stale path

* add query for webp generation

* revert query for webp because it happens after files are moved

* Add log info
This commit is contained in:
Alex 2023-04-11 20:28:25 -05:00 committed by GitHub
parent 1564807aa0
commit eb9481b668
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 2 deletions

View File

@ -79,6 +79,7 @@ describe(MediaService.name, () => {
describe('handleGenerateJpegThumbnail', () => { describe('handleGenerateJpegThumbnail', () => {
it('should generate a thumbnail for an image', async () => { it('should generate a thumbnail for an image', async () => {
assetMock.getByIds.mockResolvedValue([assetEntityStub.image]);
await sut.handleGenerateJpegThumbnail({ asset: _.cloneDeep(assetEntityStub.image) }); await sut.handleGenerateJpegThumbnail({ asset: _.cloneDeep(assetEntityStub.image) });
expect(storageMock.mkdirSync).toHaveBeenCalledWith('upload/thumbs/user-id'); expect(storageMock.mkdirSync).toHaveBeenCalledWith('upload/thumbs/user-id');
@ -94,6 +95,7 @@ describe(MediaService.name, () => {
}); });
it('should generate a thumbnail for an image from exif', async () => { it('should generate a thumbnail for an image from exif', async () => {
assetMock.getByIds.mockResolvedValue([assetEntityStub.image]);
mediaMock.resize.mockRejectedValue(new Error('unsupported format')); mediaMock.resize.mockRejectedValue(new Error('unsupported format'));
await sut.handleGenerateJpegThumbnail({ asset: _.cloneDeep(assetEntityStub.image) }); await sut.handleGenerateJpegThumbnail({ asset: _.cloneDeep(assetEntityStub.image) });
@ -114,6 +116,7 @@ describe(MediaService.name, () => {
}); });
it('should generate a thumbnail for a video', async () => { it('should generate a thumbnail for a video', async () => {
assetMock.getByIds.mockResolvedValue([assetEntityStub.video]);
await sut.handleGenerateJpegThumbnail({ asset: _.cloneDeep(assetEntityStub.video) }); await sut.handleGenerateJpegThumbnail({ asset: _.cloneDeep(assetEntityStub.video) });
expect(storageMock.mkdirSync).toHaveBeenCalledWith('upload/thumbs/user-id'); expect(storageMock.mkdirSync).toHaveBeenCalledWith('upload/thumbs/user-id');
@ -130,7 +133,7 @@ describe(MediaService.name, () => {
it('should queue some jobs', async () => { it('should queue some jobs', async () => {
const asset = _.cloneDeep(assetEntityStub.image); const asset = _.cloneDeep(assetEntityStub.image);
assetMock.getByIds.mockResolvedValue([asset]);
await sut.handleGenerateJpegThumbnail({ asset }); await sut.handleGenerateJpegThumbnail({ asset });
expect(jobMock.queue).toHaveBeenCalledWith({ name: JobName.GENERATE_WEBP_THUMBNAIL, data: { asset } }); expect(jobMock.queue).toHaveBeenCalledWith({ name: JobName.GENERATE_WEBP_THUMBNAIL, data: { asset } });
@ -140,6 +143,7 @@ describe(MediaService.name, () => {
}); });
it('should log an error', async () => { it('should log an error', async () => {
assetMock.getByIds.mockResolvedValue([assetEntityStub.image]);
mediaMock.resize.mockRejectedValue(new Error('unsupported format')); mediaMock.resize.mockRejectedValue(new Error('unsupported format'));
mediaMock.extractThumbnailFromExif.mockRejectedValue(new Error('unsupported format')); mediaMock.extractThumbnailFromExif.mockRejectedValue(new Error('unsupported format'));

View File

@ -43,7 +43,14 @@ export class MediaService {
} }
async handleGenerateJpegThumbnail(data: IAssetJob): Promise<void> { async handleGenerateJpegThumbnail(data: IAssetJob): Promise<void> {
const { asset } = data; const [asset] = await this.assetRepository.getByIds([data.asset.id]);
if (!asset) {
this.logger.warn(
`Asset not found: ${data.asset.id} - Original Path: ${data.asset.originalPath} - Resize Path: ${data.asset.resizePath}`,
);
return;
}
try { try {
const resizePath = this.storageCore.getFolderLocation(StorageFolder.THUMBNAILS, asset.ownerId); const resizePath = this.storageCore.getFolderLocation(StorageFolder.THUMBNAILS, asset.ownerId);
@ -122,6 +129,7 @@ export class MediaService {
const [asset] = await this.assetRepository.getByIds([job.asset.id]); const [asset] = await this.assetRepository.getByIds([job.asset.id]);
if (!asset) { if (!asset) {
this.logger.warn(`Asset not found: ${job.asset.id} - Original Path: ${job.asset.originalPath}`);
return; return;
} }