aboutsummaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/helpers/ffmpeg-utils.ts35
-rw-r--r--server/helpers/image-utils.ts10
-rw-r--r--server/initializers/constants.ts2
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
358function 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
358function runLiveTranscoding (rtmpUrl: string, outPath: string, resolutions: number[], fps, deleteSegments: boolean) { 392function 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 @@
1import { extname } from 'path'
1import { remove, rename } from 'fs-extra' 2import { remove, rename } from 'fs-extra'
2import { convertWebPToJPG } from './ffmpeg-utils' 3import { convertWebPToJPG, processGIF } from './ffmpeg-utils'
3import { logger } from './logger' 4import { logger } from './logger'
4 5
5const Jimp = require('jimp') 6const 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 }