From 39b571a95c99cbc4183e5d389e6d682cd8e903d9 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 19 Oct 2024 00:50:08 -0500 Subject: [PATCH] fix(server): encodes iPhone 16 Pro video with unknown audio codec (#13593) * fix(server): encodes iPhone 16 Pro video with unknown audio codec * remove white space * pr feedback + unit test * remove public method keyword * test the service * correcting unit test --- server/src/services/media.service.spec.ts | 16 ++++++++++++++++ server/src/services/media.service.ts | 4 +++- server/test/fixtures/media.stub.ts | 7 +++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index 0489169c1a..b633ed902c 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -2292,6 +2292,22 @@ describe(MediaService.name, () => { expect(mediaMock.probe).toHaveBeenCalledWith(assetStub.video.originalPath, { countFrames: false }); }); + + it('should process unknown audio stream', async () => { + mediaMock.probe.mockResolvedValue(probeStub.audioStreamUnknown); + assetMock.getByIds.mockResolvedValue([assetStub.video]); + await sut.handleVideoConversion({ id: assetStub.video.id }); + + expect(mediaMock.transcode).toHaveBeenCalledWith( + '/original/path.ext', + 'upload/encoded-video/user-id/as/se/asset-id.mp4', + expect.objectContaining({ + inputOptions: expect.any(Array), + outputOptions: expect.arrayContaining(['-c:a copy']), + twoPass: false, + }), + ); + }); }); describe('isSRGB', () => { diff --git a/server/src/services/media.service.ts b/server/src/services/media.service.ts index f270e21b6f..82e163a872 100644 --- a/server/src/services/media.service.ts +++ b/server/src/services/media.service.ts @@ -349,7 +349,9 @@ export class MediaService extends BaseService { } private getMainStream(streams: T[]): T { - return streams.sort((stream1, stream2) => stream2.frameCount - stream1.frameCount)[0]; + return streams + .filter((stream) => stream.codecName !== 'unknown') + .sort((stream1, stream2) => stream2.frameCount - stream1.frameCount)[0]; } private getTranscodeTarget( diff --git a/server/test/fixtures/media.stub.ts b/server/test/fixtures/media.stub.ts index 9b4e15a95d..cdcdfd4d5e 100644 --- a/server/test/fixtures/media.stub.ts +++ b/server/test/fixtures/media.stub.ts @@ -154,6 +154,13 @@ export const probeStub = { ...probeStubDefault, audioStreams: [{ index: 1, codecName: 'aac', frameCount: 100 }], }), + audioStreamUnknown: Object.freeze({ + ...probeStubDefault, + audioStreams: [ + { index: 0, codecName: 'aac', frameCount: 100 }, + { index: 1, codecName: 'unknown', frameCount: 200 }, + ], + }), matroskaContainer: Object.freeze({ ...probeStubDefault, format: {