diff options
-rw-r--r-- | server/helpers/ffmpeg-utils.ts | 33 | ||||
-rw-r--r-- | server/helpers/image-utils.ts | 34 | ||||
-rw-r--r-- | server/tests/api/users/users.ts | 23 | ||||
-rw-r--r-- | server/tests/fixtures/avatar-resized.gif | bin | 0 -> 88318 bytes | |||
-rw-r--r-- | server/tests/fixtures/avatar.gif | bin | 0 -> 46917 bytes |
5 files changed, 46 insertions, 44 deletions
diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index 69defccc4..9755dd67c 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts | |||
@@ -64,35 +64,14 @@ function convertWebPToJPG (path: string, destination: string): Promise<void> { | |||
64 | function processGIF ( | 64 | function processGIF ( |
65 | path: string, | 65 | path: string, |
66 | destination: string, | 66 | destination: string, |
67 | newSize: { width: number, height: number }, | 67 | newSize: { width: number, height: number } |
68 | keepOriginal = false | ||
69 | ): Promise<void> { | 68 | ): Promise<void> { |
70 | return new Promise<void>(async (res, rej) => { | 69 | const command = ffmpeg(path) |
71 | if (path === destination) { | 70 | .fps(20) |
72 | throw new Error('FFmpeg needs an input path different that the output path.') | 71 | .size(`${newSize.width}x${newSize.height}`) |
73 | } | 72 | .output(destination) |
74 | |||
75 | logger.debug('Processing gif %s to %s.', path, destination) | ||
76 | 73 | ||
77 | try { | 74 | return runCommand(command) |
78 | const command = ffmpeg(path) | ||
79 | .fps(20) | ||
80 | .size(`${newSize.width}x${newSize.height}`) | ||
81 | .output(destination) | ||
82 | |||
83 | command.on('error', (err, stdout, stderr) => { | ||
84 | logger.error('Error in ffmpeg gif resizing process.', { stdout, stderr }) | ||
85 | return rej(err) | ||
86 | }) | ||
87 | .on('end', async () => { | ||
88 | if (keepOriginal !== true) await remove(path) | ||
89 | res() | ||
90 | }) | ||
91 | .run() | ||
92 | } catch (err) { | ||
93 | return rej(err) | ||
94 | } | ||
95 | }) | ||
96 | } | 75 | } |
97 | 76 | ||
98 | async function generateImageFromVideoFile (fromPath: string, folder: string, imageName: string, size: { width: number, height: number }) { | 77 | async function generateImageFromVideoFile (fromPath: string, folder: string, imageName: string, size: { width: number, height: number }) { |
diff --git a/server/helpers/image-utils.ts b/server/helpers/image-utils.ts index fdf06e848..3ebf07305 100644 --- a/server/helpers/image-utils.ts +++ b/server/helpers/image-utils.ts | |||
@@ -1,5 +1,5 @@ | |||
1 | import { extname } from 'path' | ||
2 | import { remove, rename } from 'fs-extra' | 1 | import { remove, rename } from 'fs-extra' |
2 | import { extname } from 'path' | ||
3 | import { convertWebPToJPG, processGIF } from './ffmpeg-utils' | 3 | import { convertWebPToJPG, processGIF } from './ffmpeg-utils' |
4 | import { logger } from './logger' | 4 | import { logger } from './logger' |
5 | 5 | ||
@@ -13,17 +13,31 @@ async function processImage ( | |||
13 | ) { | 13 | ) { |
14 | const extension = extname(path) | 14 | const extension = extname(path) |
15 | 15 | ||
16 | if (path === destination) { | ||
17 | throw new Error('Jimp/FFmpeg needs an input path different that the output path.') | ||
18 | } | ||
19 | |||
20 | logger.debug('Processing image %s to %s.', path, destination) | ||
21 | |||
16 | // Use FFmpeg to process GIF | 22 | // Use FFmpeg to process GIF |
17 | if (extension === '.gif') { | 23 | if (extension === '.gif') { |
18 | return processGIF(path, destination, newSize, keepOriginal) | 24 | await processGIF(path, destination, newSize) |
25 | } else { | ||
26 | await jimpProcessor(path, destination, newSize) | ||
19 | } | 27 | } |
20 | 28 | ||
21 | if (path === destination) { | 29 | if (keepOriginal !== true) await remove(path) |
22 | throw new Error('Jimp needs an input path different that the output path.') | 30 | } |
23 | } | ||
24 | 31 | ||
25 | logger.debug('Processing image %s to %s.', path, destination) | 32 | // --------------------------------------------------------------------------- |
26 | 33 | ||
34 | export { | ||
35 | processImage | ||
36 | } | ||
37 | |||
38 | // --------------------------------------------------------------------------- | ||
39 | |||
40 | async function jimpProcessor (path: string, destination: string, newSize: { width: number, height: number }) { | ||
27 | let jimpInstance: any | 41 | let jimpInstance: any |
28 | 42 | ||
29 | try { | 43 | try { |
@@ -44,12 +58,4 @@ async function processImage ( | |||
44 | .resize(newSize.width, newSize.height) | 58 | .resize(newSize.width, newSize.height) |
45 | .quality(80) | 59 | .quality(80) |
46 | .writeAsync(destination) | 60 | .writeAsync(destination) |
47 | |||
48 | if (keepOriginal !== true) await remove(path) | ||
49 | } | ||
50 | |||
51 | // --------------------------------------------------------------------------- | ||
52 | |||
53 | export { | ||
54 | processImage | ||
55 | } | 61 | } |
diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts index edb0b4bb3..fe83ca041 100644 --- a/server/tests/api/users/users.ts +++ b/server/tests/api/users/users.ts | |||
@@ -602,8 +602,8 @@ describe('Test users', function () { | |||
602 | expect(user.account.description).to.be.null | 602 | expect(user.account.description).to.be.null |
603 | }) | 603 | }) |
604 | 604 | ||
605 | it('Should be able to update my avatar', async function () { | 605 | it('Should be able to update my avatar with a gif', async function () { |
606 | const fixture = 'avatar.png' | 606 | const fixture = 'avatar.gif' |
607 | 607 | ||
608 | await updateMyAvatar({ | 608 | await updateMyAvatar({ |
609 | url: server.url, | 609 | url: server.url, |
@@ -614,7 +614,24 @@ describe('Test users', function () { | |||
614 | const res = await getMyUserInformation(server.url, accessTokenUser) | 614 | const res = await getMyUserInformation(server.url, accessTokenUser) |
615 | const user = res.body | 615 | const user = res.body |
616 | 616 | ||
617 | await testImage(server.url, 'avatar-resized', user.account.avatar.path, '.png') | 617 | await testImage(server.url, 'avatar-resized', user.account.avatar.path, '.gif') |
618 | }) | ||
619 | |||
620 | it('Should be able to update my avatar with a gif, and then a png', async function () { | ||
621 | for (const extension of [ '.png', '.gif' ]) { | ||
622 | const fixture = 'avatar' + extension | ||
623 | |||
624 | await updateMyAvatar({ | ||
625 | url: server.url, | ||
626 | accessToken: accessTokenUser, | ||
627 | fixture | ||
628 | }) | ||
629 | |||
630 | const res = await getMyUserInformation(server.url, accessTokenUser) | ||
631 | const user = res.body | ||
632 | |||
633 | await testImage(server.url, 'avatar-resized', user.account.avatar.path, extension) | ||
634 | } | ||
618 | }) | 635 | }) |
619 | 636 | ||
620 | it('Should be able to update my display name', async function () { | 637 | it('Should be able to update my display name', async function () { |
diff --git a/server/tests/fixtures/avatar-resized.gif b/server/tests/fixtures/avatar-resized.gif new file mode 100644 index 000000000..81a82189e --- /dev/null +++ b/server/tests/fixtures/avatar-resized.gif | |||
Binary files differ | |||
diff --git a/server/tests/fixtures/avatar.gif b/server/tests/fixtures/avatar.gif new file mode 100644 index 000000000..f29707760 --- /dev/null +++ b/server/tests/fixtures/avatar.gif | |||
Binary files differ | |||