Check ffmepg version on startup

This commit is contained in:
Chocobozzz 2021-03-11 09:51:08 +01:00
parent db8b2f56c0
commit ae71acca14
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
5 changed files with 60 additions and 16 deletions

View File

@ -44,7 +44,7 @@ checkFFmpeg(CONFIG)
checkNodeVersion() checkNodeVersion()
import { checkConfig, checkActivityPubUrls } from './server/initializers/checker-after-init' import { checkConfig, checkActivityPubUrls, checkFFmpegVersion } from './server/initializers/checker-after-init'
const errorMessage = checkConfig() const errorMessage = checkConfig()
if (errorMessage !== null) { if (errorMessage !== null) {
@ -252,6 +252,9 @@ async function startApplication () {
process.exit(-1) process.exit(-1)
}) })
checkFFmpegVersion()
.catch(err => logger.error('Cannot check ffmpeg version', { err }))
// Email initialization // Email initialization
Emailer.Instance.init() Emailer.Instance.init()

View File

@ -251,6 +251,16 @@ function promisify2<T, U, A> (func: (arg1: T, arg2: U, cb: (err: any, result: A)
} }
} }
function parseSemVersion (s: string) {
const parsed = s.match(/^v?(\d+)\.(\d+)\.(\d+)$/i)
return {
major: parseInt(parsed[1]),
minor: parseInt(parsed[2]),
patch: parseInt(parsed[3])
}
}
const randomBytesPromise = promisify1<number, Buffer>(randomBytes) const randomBytesPromise = promisify1<number, Buffer>(randomBytes)
const createPrivateKey = promisify1<number, { key: string }>(pem.createPrivateKey) const createPrivateKey = promisify1<number, { key: string }>(pem.createPrivateKey)
const getPublicKey = promisify1<string, { publicKey: string }>(pem.getPublicKey) const getPublicKey = promisify1<string, { publicKey: string }>(pem.getPublicKey)
@ -288,5 +298,7 @@ export {
getPublicKey, getPublicKey,
execPromise2, execPromise2,
execPromise, execPromise,
pipelinePromise pipelinePromise,
parseSemVersion
} }

View File

@ -5,7 +5,7 @@ import { dirname, join } from 'path'
import { FFMPEG_NICE, VIDEO_LIVE } from '@server/initializers/constants' import { FFMPEG_NICE, VIDEO_LIVE } from '@server/initializers/constants'
import { AvailableEncoders, EncoderOptionsBuilder, EncoderProfile, VideoResolution } from '../../shared/models/videos' import { AvailableEncoders, EncoderOptionsBuilder, EncoderProfile, VideoResolution } from '../../shared/models/videos'
import { CONFIG } from '../initializers/config' import { CONFIG } from '../initializers/config'
import { promisify0 } from './core-utils' import { execPromise, promisify0 } from './core-utils'
import { computeFPS, getAudioStream, getVideoFileFPS } from './ffprobe-utils' import { computeFPS, getAudioStream, getVideoFileFPS } from './ffprobe-utils'
import { processImage } from './image-utils' import { processImage } from './image-utils'
import { logger } from './logger' import { logger } from './logger'
@ -649,6 +649,24 @@ function getFFmpeg (input: string, type: 'live' | 'vod') {
return command return command
} }
function getFFmpegVersion () {
return new Promise<string>((res, rej) => {
(ffmpeg() as any)._getFfmpegPath((err, ffmpegPath) => {
if (err) return rej(err)
if (!ffmpegPath) return rej(new Error('Could not find ffmpeg path'))
return execPromise(`${ffmpegPath} -version`)
.then(stdout => {
const parsed = stdout.match(/ffmpeg version .(\d+\.\d+\.\d+)/)
if (!parsed || !parsed[1]) return rej(new Error(`Could not find ffmpeg version in ${stdout}`))
return res(parsed[1])
})
.catch(err => rej(err))
})
})
}
async function runCommand (options: { async function runCommand (options: {
command: ffmpeg.FfmpegCommand command: ffmpeg.FfmpegCommand
silent?: boolean // false silent?: boolean // false
@ -695,6 +713,7 @@ export {
TranscodeOptionsType, TranscodeOptionsType,
transcode, transcode,
runCommand, runCommand,
getFFmpegVersion,
resetSupportedEncoders, resetSupportedEncoders,

View File

@ -1,16 +1,17 @@
import * as config from 'config' import * as config from 'config'
import { isProdInstance, isTestInstance } from '../helpers/core-utils'
import { UserModel } from '../models/account/user'
import { getServerActor, ApplicationModel } from '../models/application/application'
import { OAuthClientModel } from '../models/oauth/oauth-client'
import { URL } from 'url'
import { CONFIG, isEmailEnabled } from './config'
import { logger } from '../helpers/logger'
import { RecentlyAddedStrategy } from '../../shared/models/redundancy'
import { isArray } from '../helpers/custom-validators/misc'
import { uniq } from 'lodash' import { uniq } from 'lodash'
import { WEBSERVER } from './constants' import { URL } from 'url'
import { getFFmpegVersion } from '@server/helpers/ffmpeg-utils'
import { VideoRedundancyConfigFilter } from '@shared/models/redundancy/video-redundancy-config-filter.type' import { VideoRedundancyConfigFilter } from '@shared/models/redundancy/video-redundancy-config-filter.type'
import { RecentlyAddedStrategy } from '../../shared/models/redundancy'
import { isProdInstance, isTestInstance, parseSemVersion } from '../helpers/core-utils'
import { isArray } from '../helpers/custom-validators/misc'
import { logger } from '../helpers/logger'
import { UserModel } from '../models/account/user'
import { ApplicationModel, getServerActor } from '../models/application/application'
import { OAuthClientModel } from '../models/oauth/oauth-client'
import { CONFIG, isEmailEnabled } from './config'
import { WEBSERVER } from './constants'
async function checkActivityPubUrls () { async function checkActivityPubUrls () {
const actor = await getServerActor() const actor = await getServerActor()
@ -176,11 +177,21 @@ async function applicationExist () {
return totalApplication !== 0 return totalApplication !== 0
} }
async function checkFFmpegVersion () {
const version = await getFFmpegVersion()
const { major, minor } = parseSemVersion(version)
if (major < 4 || (major === 4 && minor < 1)) {
logger.warn('Your ffmpeg version (%s) is outdated. PeerTube supports ffmpeg >= 4.1. Please upgrade.', version)
}
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
export { export {
checkConfig, checkConfig,
clientsExist, clientsExist,
checkFFmpegVersion,
usersExist, usersExist,
applicationExist, applicationExist,
checkActivityPubUrls checkActivityPubUrls

View File

@ -1,5 +1,5 @@
import * as config from 'config' import * as config from 'config'
import { promisify0 } from '../helpers/core-utils' import { parseSemVersion, promisify0 } from '../helpers/core-utils'
import { logger } from '../helpers/logger' import { logger } from '../helpers/logger'
// ONLY USE CORE MODULES IN THIS FILE! // ONLY USE CORE MODULES IN THIS FILE!
@ -102,8 +102,7 @@ async function checkFFmpeg (CONFIG: { TRANSCODING: { ENABLED: boolean } }) {
function checkNodeVersion () { function checkNodeVersion () {
const v = process.version const v = process.version
const majorString = v.split('.')[0].replace('v', '') const { major } = parseSemVersion(v)
const major = parseInt(majorString, 10)
logger.debug('Checking NodeJS version %s.', v) logger.debug('Checking NodeJS version %s.', v)