1
0
mirror of https://github.com/immich-app/immich.git synced 2024-11-24 08:52:28 +02:00

fix(server): extract duration from video as ISO time (#6863)

* fix(server): extract duration from video as ISO time

* feedback and add test

* fix test
This commit is contained in:
Alex 2024-02-02 14:58:13 -06:00 committed by GitHub
parent 2d278d9ab8
commit b768eef44d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 22 additions and 3 deletions

View File

@ -547,6 +547,22 @@ describe(MetadataService.name, () => {
);
});
it('should handle duration in ISO time string', async () => {
assetMock.getByIds.mockResolvedValue([assetStub.image]);
metadataMock.readTags.mockResolvedValue({ Duration: '00:00:08.41' });
await sut.handleMetadataExtraction({ id: assetStub.image.id });
expect(assetMock.getByIds).toHaveBeenCalledWith([assetStub.image.id]);
expect(assetMock.upsertExif).toHaveBeenCalled();
expect(assetMock.save).toHaveBeenCalledWith(
expect.objectContaining({
id: assetStub.image.id,
duration: '00:00:08.410',
}),
);
});
it('should handle duration as an object without Scale', async () => {
assetMock.getByIds.mockResolvedValue([assetStub.image]);
metadataMock.readTags.mockResolvedValue({ Duration: { Value: 6.2 } });

View File

@ -12,7 +12,6 @@ import { IBaseJob, IEntityJob, ISidecarWriteJob, JOBS_ASSET_PAGINATION_SIZE, Job
import {
ClientEvent,
DatabaseLock,
ExifDuration,
IAlbumRepository,
IAssetRepository,
ICommunicationRepository,
@ -555,11 +554,15 @@ export class MetadataService {
return bitsPerSample;
}
private getDuration(seconds?: number | ExifDuration): string {
private getDuration(seconds?: ImmichTags['Duration']): string {
let _seconds = seconds as number;
if (typeof seconds === 'object') {
_seconds = seconds.Value * (seconds?.Scale || 1);
} else if (typeof seconds === 'string') {
_seconds = Duration.fromISOTime(seconds).as('seconds');
}
return Duration.fromObject({ seconds: _seconds }).toFormat('hh:mm:ss.SSS');
}
}

View File

@ -26,7 +26,7 @@ export interface ImmichTags extends Omit<Tags, 'FocalLength' | 'Duration'> {
MediaGroupUUID?: string;
ImagePixelDepth?: string;
FocalLength?: number;
Duration?: number | ExifDuration;
Duration?: number | string | ExifDuration;
EmbeddedVideoType?: string;
EmbeddedVideoFile?: BinaryField;
MotionPhotoVideo?: BinaryField;