Skip to content

Commit 06a18f5

Browse files
committed
fix: tempfile was removed before being used
1 parent 93633cf commit 06a18f5

File tree

2 files changed

+21
-23
lines changed

2 files changed

+21
-23
lines changed

src/TranscribeService/TranscribeService.ts

+18-20
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { OpenAI } from 'openai';
22
import Configuration from 'openai';
3-
import { spawn } from 'child_process';
3+
import { execSync, spawn } from 'child_process';
44
import { nanoid } from 'nanoid';
55
import { signUrl, uploadToS3 } from '../aws/upload';
6-
import fs, { unlinkSync } from 'fs';
6+
import fs, { statSync, unlinkSync } from 'fs';
77
import { join } from 'path';
88
import { getAudioDuration, splitAudioOnSilence } from '../audio/chunker';
99

@@ -52,28 +52,26 @@ export class TranscribeService {
5252
this.openai = new OpenAI({ ...config });
5353
}
5454

55-
private convertToMP3(videoUrl: string): Promise<string[]> {
55+
private async convertToMP3(videoUrl: string): Promise<string[]> {
5656
const stagingDir = process.env.STAGING_DIR || '/tmp/';
5757
const tempFile = join(stagingDir, `${nanoid()}.mp3`);
5858

59-
return new Promise((resolve, reject) => {
59+
try {
6060
console.log(`Converting ${videoUrl} to ${tempFile}`);
61-
const ffmpeg = spawn('ffmpeg', ['-i', videoUrl, '-f', 'mp3', tempFile]);
62-
ffmpeg.on('close', async () => {
63-
try {
64-
console.log(`Conversion compleded. Now splitting into chunks...`);
65-
const chunks = await splitAudioOnSilence(tempFile);
66-
unlinkSync(tempFile);
67-
resolve(chunks);
68-
} catch (error) {
69-
reject(error);
70-
}
71-
});
72-
ffmpeg.on('error', (err) => {
73-
console.error('Error:', err);
74-
reject(err);
75-
});
76-
});
61+
execSync(`ffmpeg -i "${videoUrl}" -f mp3 "${tempFile}"`);
62+
console.log(`Conversion completed. Now splitting into chunks...`);
63+
if (!statSync(tempFile).isFile()) {
64+
throw new Error('Error converting video, temp file not found');
65+
}
66+
const chunks = splitAudioOnSilence(tempFile);
67+
console.log(`Splited into ${chunks.length} chunks`);
68+
unlinkSync(tempFile);
69+
console.log(`Deleted temp file ${tempFile}`);
70+
return chunks;
71+
} catch (error) {
72+
console.error(error);
73+
throw new Error('Error converting video');
74+
}
7775
}
7876

7977
get id(): string {

src/audio/chunker.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import { join } from 'path';
55

66
const MAX_CHUNK_SIZE = 25 * 1024 * 1024; // 25MB
77

8-
export async function getAudioDuration(filePath: string) {
8+
export function getAudioDuration(filePath: string) {
99
const output = execSync(
1010
`ffprobe -i "${filePath}" -show_entries format=duration -v quiet -of csv="p=0"`
1111
);
1212
return parseFloat(output.toString().trim());
1313
}
1414

15-
export async function splitAudioOnSilence(inputFile: string) {
15+
export function splitAudioOnSilence(inputFile: string) {
1616
const stagingDir = process.env.STAGING_DIR || '/tmp/';
1717
const baseOutputFile = join(stagingDir, `${nanoid()}_chunk_%03d.mp3`);
1818

@@ -40,7 +40,7 @@ export async function splitAudioOnSilence(inputFile: string) {
4040
return [inputFile];
4141
}
4242
// If no silences found but file is too big, split in equal chunks
43-
const duration = await getAudioDuration(inputFile);
43+
const duration = getAudioDuration(inputFile);
4444
const chunks = Math.ceil(stats.size / MAX_CHUNK_SIZE);
4545
const chunkDuration = duration / chunks;
4646

0 commit comments

Comments
 (0)