← back to Butlr

scripts/finalize-recordings.js

31 lines

#!/usr/bin/env node
// Walk data/recordings/, convert any .pcm with no matching .mp3 → MP3 via ffmpeg.

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

const DIR = path.join(__dirname, '..', 'data', 'recordings');
if (!fs.existsSync(DIR)) { console.log('no recordings dir'); process.exit(0); }

const files = fs.readdirSync(DIR);
const pcms = files.filter(f => f.endsWith('.pcm'));
let made = 0;
for (const pcm of pcms) {
  const base = pcm.replace(/\.pcm$/, '');
  const pcmPath = path.join(DIR, pcm);
  const mp3Path = path.join(DIR, base + '.mp3');
  if (fs.existsSync(mp3Path)) continue;
  const sz = fs.statSync(pcmPath).size;
  if (sz < 1024) { console.log(`  skip ${pcm} (too small: ${sz}b)`); continue; }
  try {
    execSync(`ffmpeg -y -f s16le -ar 8000 -ac 1 -i "${pcmPath}" -codec:a libmp3lame -q:a 4 "${mp3Path}" 2>/dev/null`, { stdio: 'pipe' });
    const mp3sz = fs.statSync(mp3Path).size;
    console.log(`  ${base}: ${(sz/1024).toFixed(1)} KB pcm → ${(mp3sz/1024).toFixed(1)} KB mp3`);
    made++;
  } catch (e) {
    console.log(`  ${base}: ffmpeg failed: ${e.message.split('\n')[0]}`);
  }
}
console.log(`Finalized ${made}/${pcms.length} recordings.`);