fix(gateway): repair Ogg page CRCs + deliver recordings as MP3
Build & Deploy (Nix) / build-and-deploy (proxy) (push) Successful in 3m44s
Build & Deploy (Nix) / build-and-deploy (backend) (push) Successful in 4m13s
Build & Deploy (Nix) / build-and-deploy (discord-gateway) (push) Successful in 11m33s

Root cause rekaman gak bisa dibuka: prism-media OggLogicalBitstream
dipanggil dengan crc:false (node-crc dihapus dari dependency tree) —
semua page Ogg punya checksum 0 — player strict (ffmpeg, iOS) tolak
dengan 'CRC mismatch / End of file'. Rekaman 13:11 terbukti CRC-invalid.

Fix:
1. recorder/oggCrc.ts (baru): recompute CRC-32 (RFC3533, poly 0x04c11db7,
   initial 0, MSB-first) tiap page OggS in-place — pure JS tanpa native dep.
2. segmentFinalizer.ts: panggil fixOggCrc sebelum upload/merge.
3. recorder/uploader.ts: transcode segment ke MP3 (libmp3lame 128k 48k
   stereo) sebelum upload tele — universal playback. filename+size DB
   di-update; source OGG tetap untuk transkripsi.
4. muxer.ts + recorder.ts: merged session file juga .mp3.

Verified: ffprobe baca segmen yang tadinya CRC mismatch, MP3 valid.
This commit is contained in:
asepharyana
2026-08-01 16:05:51 +07:00
parent 0ef2b715c4
commit 6ce784471e
6 changed files with 136 additions and 9 deletions
@@ -81,6 +81,8 @@ export async function updateVoiceRecordingAsUploaded(
id: string,
downloadUrl: string,
uploadedAt: number,
filename?: string,
sizeBytes?: number,
): Promise<void> {
try {
await db()
@@ -89,6 +91,8 @@ export async function updateVoiceRecordingAsUploaded(
download_url: downloadUrl,
upload_status: "uploaded",
uploaded_at: uploadedAt,
...(filename !== undefined ? { filename } : {}),
...(sizeBytes !== undefined ? { size_bytes: sizeBytes } : {}),
})
.where(eq(voiceRecordingsTable.id, id));
} catch (error) {