diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/helpers/ffmpeg-utils.ts | 35 | ||||
-rw-r--r-- | server/helpers/image-utils.ts | 10 | ||||
-rw-r--r-- | server/initializers/constants.ts | 2 |
3 files changed, 45 insertions, 2 deletions
diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index c8d6969ff..66b9d2e44 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts | |||
@@ -355,6 +355,40 @@ function convertWebPToJPG (path: string, destination: string): Promise<void> { | |||
355 | }) | 355 | }) |
356 | } | 356 | } |
357 | 357 | ||
358 | function processGIF ( | ||
359 | path: string, | ||
360 | destination: string, | ||
361 | newSize: { width: number, height: number }, | ||
362 | keepOriginal = false | ||
363 | ): Promise<void> { | ||
364 | return new Promise<void>(async (res, rej) => { | ||
365 | if (path === destination) { | ||
366 | throw new Error('FFmpeg needs an input path different that the output path.') | ||
367 | } | ||
368 | |||
369 | logger.debug('Processing gif %s to %s.', path, destination) | ||
370 | |||
371 | try { | ||
372 | const command = ffmpeg(path) | ||
373 | .fps(20) | ||
374 | .size(`${newSize.width}x${newSize.height}`) | ||
375 | .output(destination) | ||
376 | |||
377 | command.on('error', (err, stdout, stderr) => { | ||
378 | logger.error('Error in ffmpeg gif resizing process.', { stdout, stderr }) | ||
379 | return rej(err) | ||
380 | }) | ||
381 | .on('end', async () => { | ||
382 | if (keepOriginal !== true) await remove(path) | ||
383 | res() | ||
384 | }) | ||
385 | .run() | ||
386 | } catch (err) { | ||
387 | return rej(err) | ||
388 | } | ||
389 | }) | ||
390 | } | ||
391 | |||
358 | function runLiveTranscoding (rtmpUrl: string, outPath: string, resolutions: number[], fps, deleteSegments: boolean) { | 392 | function runLiveTranscoding (rtmpUrl: string, outPath: string, resolutions: number[], fps, deleteSegments: boolean) { |
359 | const command = getFFmpeg(rtmpUrl) | 393 | const command = getFFmpeg(rtmpUrl) |
360 | command.inputOption('-fflags nobuffer') | 394 | command.inputOption('-fflags nobuffer') |
@@ -474,6 +508,7 @@ export { | |||
474 | getAudioStreamCodec, | 508 | getAudioStreamCodec, |
475 | runLiveMuxing, | 509 | runLiveMuxing, |
476 | convertWebPToJPG, | 510 | convertWebPToJPG, |
511 | processGIF, | ||
477 | getVideoStreamSize, | 512 | getVideoStreamSize, |
478 | getVideoFileResolution, | 513 | getVideoFileResolution, |
479 | getMetadataFromFile, | 514 | getMetadataFromFile, |
diff --git a/server/helpers/image-utils.ts b/server/helpers/image-utils.ts index 5f254a7aa..fdf06e848 100644 --- a/server/helpers/image-utils.ts +++ b/server/helpers/image-utils.ts | |||
@@ -1,5 +1,6 @@ | |||
1 | import { extname } from 'path' | ||
1 | import { remove, rename } from 'fs-extra' | 2 | import { remove, rename } from 'fs-extra' |
2 | import { convertWebPToJPG } from './ffmpeg-utils' | 3 | import { convertWebPToJPG, processGIF } from './ffmpeg-utils' |
3 | import { logger } from './logger' | 4 | import { logger } from './logger' |
4 | 5 | ||
5 | const Jimp = require('jimp') | 6 | const Jimp = require('jimp') |
@@ -10,6 +11,13 @@ async function processImage ( | |||
10 | newSize: { width: number, height: number }, | 11 | newSize: { width: number, height: number }, |
11 | keepOriginal = false | 12 | keepOriginal = false |
12 | ) { | 13 | ) { |
14 | const extension = extname(path) | ||
15 | |||
16 | // Use FFmpeg to process GIF | ||
17 | if (extension === '.gif') { | ||
18 | return processGIF(path, destination, newSize, keepOriginal) | ||
19 | } | ||
20 | |||
13 | if (path === destination) { | 21 | if (path === destination) { |
14 | throw new Error('Jimp needs an input path different that the output path.') | 22 | throw new Error('Jimp needs an input path different that the output path.') |
15 | } | 23 | } |
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 79e6a744c..5c6d06077 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts | |||
@@ -291,7 +291,7 @@ const CONSTRAINTS_FIELDS = { | |||
291 | PRIVATE_KEY: { min: 10, max: 5000 }, // Length | 291 | PRIVATE_KEY: { min: 10, max: 5000 }, // Length |
292 | URL: { min: 3, max: 2000 }, // Length | 292 | URL: { min: 3, max: 2000 }, // Length |
293 | AVATAR: { | 293 | AVATAR: { |
294 | EXTNAME: [ '.png', '.jpeg', '.jpg' ], | 294 | EXTNAME: [ '.png', '.jpeg', '.jpg', '.gif' ], |
295 | FILE_SIZE: { | 295 | FILE_SIZE: { |
296 | max: 2 * 1024 * 1024 // 2MB | 296 | max: 2 * 1024 * 1024 // 2MB |
297 | } | 297 | } |