Spaces:
Running
Running
| import fs from 'fs-extra' | |
| import path from 'path' | |
| import which from 'which' | |
| import os from 'os' | |
| import { fileURLToPath } from 'url'; | |
| import { dirname } from 'path'; | |
| import ffbinaries from 'ffbinaries' | |
| const __filename = fileURLToPath(import.meta.url); | |
| const __dirname = dirname(__filename) | |
| var dest = path.join(__dirname, '/ffmpeg'); | |
| async function createSymlink(targetPath, symlinkPath) { | |
| try { | |
| console.log('Adding Symlink', symlinkPath, '=>', targetPath) | |
| if (!(await fs.pathExists(targetPath))) { | |
| console.error('Target executable not found:', targetPath); | |
| return; | |
| } | |
| if (await fs.exists(symlinkPath)) { | |
| await fs.unlink(symlinkPath); | |
| } | |
| if (await fs.pathExists(symlinkPath)) { | |
| await fs.remove(symlinkPath); | |
| } | |
| await fs.symlink(targetPath, symlinkPath); | |
| console.log('Symlink created successfully:', symlinkPath); | |
| } catch (error) { | |
| console.error('An error occurred:', error.message); | |
| } | |
| } | |
| async function findAndCreateSymlink(targetExecutable, ffmpegPath) { | |
| try { | |
| // Find the target executable in the system's PATH | |
| var ffmpegPath = ffmpegPath || await which(targetExecutable); | |
| let remotionFolder = path.join(__dirname, 'node_modules', '@remotion') | |
| const files = fs.readdirSync(remotionFolder); | |
| files.forEach((file) => { | |
| const filePath = path.join(remotionFolder, file); | |
| const stat = fs.statSync(filePath); | |
| if (stat.isDirectory() && file.startsWith('compositor-')) { | |
| const symlinkPath = path.join(filePath, 'ffmpeg', 'remotion', 'bin', targetExecutable); | |
| // await createSymlink(ffmpegPath, symlinkPath); | |
| fs.copyFileSync(ffmpegPath, symlinkPath) | |
| console.log('Copied to', symlinkPath) | |
| } | |
| }); | |
| } catch (error) { | |
| console.error('An error occurred while creating symlink ffmpeg:', error); | |
| } | |
| } | |
| const ffmpegtargetExecutable = os.platform() === 'win32' ? 'ffmpeg.exe' : 'ffmpeg'; | |
| const ffprobetargetExecutable = os.platform() === 'win32' ? 'ffprobe.exe' : 'ffprobe'; | |
| const ffmpegPath = path.join(dest, ffmpegtargetExecutable) | |
| const ffprobePath = path.join(dest, ffprobetargetExecutable) | |
| function classifyOS() { | |
| const platform = os.platform(); | |
| const arch = os.arch(); | |
| if (platform === 'win32' && arch === 'x64') { | |
| return 'windows-64'; | |
| } else if (platform === 'linux' && arch === 'ia32') { | |
| return 'linux-32'; | |
| } else if (platform === 'linux' && arch === 'x64') { | |
| return 'linux-64'; | |
| } else if (platform === 'linux' && arch === 'arm') { | |
| const armVersion = os.endianness() === 'LE' ? 'el' : 'hf'; | |
| return `linux-arm${armVersion}`; | |
| } else if (platform === 'linux' && arch === 'arm64') { | |
| return 'linux-arm64'; | |
| } else if (platform === 'darwin' && arch === 'x64') { | |
| return 'osx-64'; | |
| } else { | |
| return 'unknown'; | |
| } | |
| } | |
| function process() { | |
| findAndCreateSymlink(ffmpegtargetExecutable, ffmpegPath); | |
| findAndCreateSymlink(ffprobetargetExecutable, ffprobePath); | |
| } | |
| if (!fs.existsSync(ffmpegPath) || !fs.existsSync(ffprobePath)) { | |
| let platform = classifyOS() | |
| console.log(`Downloading ffmpeg and ffprobe binaries for ${platform} to ` + dest); | |
| ffbinaries.downloadBinaries(['ffmpeg', 'ffprobe'], { platform: platform, quiet: true, destination: dest }, function () { | |
| console.log(`Downloaded ffplay and ffprobe binaries for ${platform} to ` + dest + '.'); | |
| process() | |
| }); | |
| } | |
| else { | |
| process() | |
| } | |