diff options
-rw-r--r-- | server/helpers/ffmpeg-utils.ts | 18 | ||||
-rw-r--r-- | server/helpers/image-utils.ts | 21 |
2 files changed, 34 insertions, 5 deletions
diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index 557fb5e3a..0cfc51775 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts | |||
@@ -338,11 +338,29 @@ function getClosestFramerateStandard (fps: number, type: 'HD_STANDARD' | 'STANDA | |||
338 | .sort((a, b) => fps % a - fps % b)[0] | 338 | .sort((a, b) => fps % a - fps % b)[0] |
339 | } | 339 | } |
340 | 340 | ||
341 | function convertWebPToJPG (path: string, destination: string): Promise<void> { | ||
342 | return new Promise<void>(async (res, rej) => { | ||
343 | try { | ||
344 | const command = ffmpeg(path).output(destination) | ||
345 | |||
346 | command.on('error', (err, stdout, stderr) => { | ||
347 | logger.error('Error in ffmpeg webp convert process.', { stdout, stderr }) | ||
348 | return rej(err) | ||
349 | }) | ||
350 | .on('end', () => res()) | ||
351 | .run() | ||
352 | } catch (err) { | ||
353 | return rej(err) | ||
354 | } | ||
355 | }) | ||
356 | } | ||
357 | |||
341 | // --------------------------------------------------------------------------- | 358 | // --------------------------------------------------------------------------- |
342 | 359 | ||
343 | export { | 360 | export { |
344 | getVideoStreamCodec, | 361 | getVideoStreamCodec, |
345 | getAudioStreamCodec, | 362 | getAudioStreamCodec, |
363 | convertWebPToJPG, | ||
346 | getVideoStreamSize, | 364 | getVideoStreamSize, |
347 | getVideoFileResolution, | 365 | getVideoFileResolution, |
348 | getMetadataFromFile, | 366 | getMetadataFromFile, |
diff --git a/server/helpers/image-utils.ts b/server/helpers/image-utils.ts index b1c7d3d47..f2f6a004f 100644 --- a/server/helpers/image-utils.ts +++ b/server/helpers/image-utils.ts | |||
@@ -1,6 +1,7 @@ | |||
1 | import 'multer' | 1 | import { remove, rename } from 'fs-extra' |
2 | import { readFile, remove } from 'fs-extra' | 2 | import { convertWebPToJPG } from './ffmpeg-utils' |
3 | import { logger } from './logger' | 3 | import { logger } from './logger' |
4 | |||
4 | const Jimp = require('jimp') | 5 | const Jimp = require('jimp') |
5 | 6 | ||
6 | async function processImage ( | 7 | async function processImage ( |
@@ -15,9 +16,19 @@ async function processImage ( | |||
15 | 16 | ||
16 | logger.debug('Processing image %s to %s.', path, destination) | 17 | logger.debug('Processing image %s to %s.', path, destination) |
17 | 18 | ||
18 | // Avoid sharp cache | 19 | let jimpInstance: any |
19 | const buf = await readFile(path) | 20 | |
20 | const jimpInstance = await Jimp.read(buf) | 21 | try { |
22 | jimpInstance = await Jimp.read(path) | ||
23 | } catch (err) { | ||
24 | logger.debug('Cannot read %s with jimp. Try to convert the image using ffmpeg first.', { err }) | ||
25 | |||
26 | const newName = path + '.jpg' | ||
27 | await convertWebPToJPG(path, newName) | ||
28 | await rename(newName, path) | ||
29 | |||
30 | jimpInstance = await Jimp.read(path) | ||
31 | } | ||
21 | 32 | ||
22 | await remove(destination) | 33 | await remove(destination) |
23 | 34 | ||