diff --git a/server/package-lock.json b/server/package-lock.json index c4e3f52df..e35ef6616 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -24,6 +24,7 @@ "debug": "^4.3.1", "engine.io": "^5.2.0", "express": "^4.17.1", + "ffmpeg-for-homebridge": "^0.0.9", "level": "^6.0.1", "lodash": "^4.17.21", "memfs": "^3.2.2", @@ -1276,6 +1277,14 @@ "webidl-conversions": "^4.0.2" } }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "engines": { + "node": ">=10" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1469,6 +1478,30 @@ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" }, + "node_modules/ffmpeg-for-homebridge": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ffmpeg-for-homebridge/-/ffmpeg-for-homebridge-0.0.9.tgz", + "integrity": "sha512-HmUatYfEf0dI7kbSh2vGLkJCuY7YLJODPn64Ng/Fj8YjpPbrLFGQBzvdQFBUC6RgGpvqEdlgZNQR8N9wEZuziQ==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3", + "dotenv": "^8.2.0", + "mkdirp": "^1.0.3", + "simple-get": "^3.1.0", + "tar": "^6.0.1" + } + }, + "node_modules/ffmpeg-for-homebridge/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -4380,6 +4413,11 @@ "webidl-conversions": "^4.0.2" } }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4544,6 +4582,25 @@ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" }, + "ffmpeg-for-homebridge": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ffmpeg-for-homebridge/-/ffmpeg-for-homebridge-0.0.9.tgz", + "integrity": "sha512-HmUatYfEf0dI7kbSh2vGLkJCuY7YLJODPn64Ng/Fj8YjpPbrLFGQBzvdQFBUC6RgGpvqEdlgZNQR8N9wEZuziQ==", + "requires": { + "detect-libc": "^1.0.3", + "dotenv": "^8.2.0", + "mkdirp": "^1.0.3", + "simple-get": "^3.1.0", + "tar": "^6.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", diff --git a/server/package.json b/server/package.json index 5693d8669..2a9f0e6b5 100644 --- a/server/package.json +++ b/server/package.json @@ -18,6 +18,7 @@ "debug": "^4.3.1", "engine.io": "^5.2.0", "express": "^4.17.1", + "ffmpeg-for-homebridge": "^0.0.9", "level": "^6.0.1", "lodash": "^4.17.21", "memfs": "^3.2.2", diff --git a/server/src/plugin/media.ts b/server/src/plugin/media.ts index c7bcf0178..8681ca6f2 100644 --- a/server/src/plugin/media.ts +++ b/server/src/plugin/media.ts @@ -9,6 +9,7 @@ import tmp from 'tmp'; import net from 'net'; import os from 'os'; import { listenZeroCluster } from "./cluster-helper"; +import pathToFfmpeg from 'ffmpeg-for-homebridge'; const wrtc = require('wrtc'); Object.assign(global, wrtc); @@ -290,9 +291,8 @@ export class MediaManagerImpl implements MediaManager { } async getFFmpegPath(): Promise { - if (os.platform() === 'win32') - return 'ffmpeg.exe'; - return 'ffmpeg'; + const defaultPath = os.platform() === 'win32' ? 'ffmpeg.exe' : 'ffmpeg'; + return pathToFfmpeg || defaultPath; } getConverters(): BufferConverter[] { diff --git a/server/src/scrypted-main.ts b/server/src/scrypted-main.ts index 25f057625..b4736d403 100644 --- a/server/src/scrypted-main.ts +++ b/server/src/scrypted-main.ts @@ -28,25 +28,10 @@ process.on('unhandledRejection', error => { console.warn('unhandled rejection of RPC Result', error); }); -function checkPrerequisites() { - const ffmpeg = os.platform() === 'win32' ? 'ffmpeg.exe' : 'ffmpeg'; - const cp = child_process.spawn(ffmpeg, { - stdio: 'ignore', - }) - cp.on('error', e => { - console.error('#############################################'); - console.error(`ffmpeg was not found in path!`); - console.error('#############################################'); - }) -} - - if (!cluster.isMaster) { startPluginRemoteClusterWorker(); } else { - checkPrerequisites(); - let workerInspectPort: number = undefined; const debugServer = net.createServer(socket => {