diff --git a/server.js b/server.js index 139e1a8..54e2ff7 100644 --- a/server.js +++ b/server.js @@ -2,6 +2,7 @@ const express = require('express'); const cors = require('cors'); const dotenv = require('dotenv'); const fs = require('fs'); +const os = require('os'); const path = require('path'); const http = require('http'); const WebSocket = require('ws'); @@ -174,10 +175,23 @@ app.post('/api/transcode', async (req, res) => { const response = await s3Client.send(command); const s3Stream = response.Body; + const tmpInputPath = path.join(os.tmpdir(), `s3-input-${Date.now()}-${Math.random().toString(16).slice(2)}.tmp`); + await new Promise((resolve, reject) => { + const writeStream = fs.createWriteStream(tmpInputPath); + s3Stream.pipe(writeStream); + s3Stream.on('error', reject); + writeStream.on('error', reject); + writeStream.on('finish', resolve); + }); + // Triggers fluent-ffmpeg to transcode to MP4 console.log(`Starting transcoding for ${key} with codec ${videoCodec}`); - ffmpeg(s3Stream) + const cleanupTmpInput = () => { + fs.unlink(tmpInputPath, () => {}); + }; + + ffmpeg(tmpInputPath) .videoCodec(videoCodec) .audioCodec('aac') .outputOptions([ @@ -204,6 +218,7 @@ app.post('/api/transcode', async (req, res) => { console.log(`ffmpeg stderr: ${stderrLine}`); }) .on('end', () => { + cleanupTmpInput(); console.log(`Finished transcoding ${key} to MP4`); let progressState; try { @@ -223,6 +238,7 @@ app.post('/api/transcode', async (req, res) => { } }) .on('error', (err) => { + cleanupTmpInput(); console.error(`Error transcoding ${key}:`, err); const failedState = { status: 'failed', percent: progressMap[progressKey]?.percent || 0, details: err.message || 'Transcoding failed', mp4Url }; progressMap[progressKey] = failedState;